Как вернуть два значения из метода?
Как вернуть два значения из метода? При таком коде выдаёт предупреждение cs0162.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
public static double Rasstoyanie(double x, double y) { double r = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)); double a = Math.Atan(x / y); return r; { return a; } }
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Вернуть из метода два значения
Подскажите, как вернуть из метода переменную, которой присвоено значение в данном методе: .
Как правильно вернуть значения из метода?
Ребят, есть вот такой вот баян ниже. Для возврата нескольких значений, говорят нужно создавать.

Как вернуть из функции два значения
Доброго времени суток! Подскажите, пожалуйста, как вернуть два значения: row и column из функции.
Как вернуть два значения из функции?
Ребят, нужно вернуть из функции два значения. Подскажите как. Без массива public double.
538 / 347 / 117
Регистрация: 17.08.2014
Сообщений: 1,297
NikitaKocher, либо структурой с 2мя значениями либо с помощью параметров out или ref
Регистрация: 13.10.2019
Сообщений: 44
а можно кодом подалйста просто я только начал изучать и мне сложно понять что это означает)
Добавлено через 24 минуты
Вот полный код как бы вписал out но возникает ошибка в этих строчках. Ошибка cs7036
1 2 3
double k1 = Class1.Rasstoyanie(x1, y1); double k2 = Class1.Rasstoyanie(x2, y2); double k3 = Class1.Rasstoyanie(x3, y3);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } double Vvod(TextBox t) { return Convert.ToDouble(t.Text); } void Vivod(TextBox t, double z) { t.Text = z.ToString("F5"); } class Class1 { public static double Rasstoyanie(double x, double y, ref double a) { double r = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)); a = Math.Atan(x / y); return r; } } private void button1_Click(object sender, EventArgs e) { double x1, x2, x3, y1, y2, y3; x1 = Vvod(textBox1); x2 = Vvod(textBox2); x3 = Vvod(textBox3); y1 = Vvod(textBox4); y2 = Vvod(textBox5); y3 = Vvod(textBox6); double k1 = Class1.Rasstoyanie(x1, y1); double k2 = Class1.Rasstoyanie(x2, y2); double k3 = Class1.Rasstoyanie(x3, y3); Vivod(textBox7, k1); Vivod(textBox8, k2); Vivod(textBox9, k3); } private void button2_Click(object sender, EventArgs e) { DialogResult result = MessageBox.Show(" вы точно хотите выйти?", "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (result == DialogResult.Yes) Application.Exit(); } } }
Как вернуть несколько значений из функции java
В Java мы не можем вернуть несколько значений из метода, только одно. Но мы можем возвратить массив, список или мапу, содержащие нужные нам данные. Например :
public static ListInteger> func() int a=1, b=2, c=3; return List.of(a, b, c); >
Также можно описать класс, содержащий несколько переменных разных типов, и вернуть объект этого класса.
// пусть нам необходимо вернуть число, строку и логическое значение class MyClass private int age; private String name; private boolean isMan; public MyClass(int age, String name, boolean isMan) this.age = age; this.name = name; this.isMan = isMan; > public int getAge() return age; > public String getName() return name; > public boolean getIsMan() return isMan; > >
Получение объекта с несколькими параметрами из метода :
public class App public static void main(String[] args) throws Exception MyClass x = func(); // получаем объект нашего класса System.out.println(x.getAge() + " " + x.getName() + " " + x.getIsMan()); // => 20 Ivan true > // метод, возвращающий несколько значений в виде объекта public static MyClass func() // создаем объект нашего класса и возвращаем его return new MyClass(20, "Ivan", true); > >
Научный форум dxdy
Я хотел бы написать метод отыскания собственных значений и векторов симметричной действительной матрицы. Получается, что метод должен возвращать две матрицы. Я что-то никак не могу сообразить как это сделать. Можно конечно передать через out или через поля объекта, но мне кажется, что можно еще через tuples. Как кстати будет по русски tuples и подходят ли они для этой задачи?
Re: Как вернуть два массива из метода C#
23.08.2011, 03:33
Еще одно замечание. Я планирую использовать метод Якоби для отыскания собственных значений. Этот метод, мне кажется, можно запрограммировать используя рекурсию, так что если вернуть два массива, то было бы очень все просто.
Re: Как вернуть два массива из метода C#
23.08.2011, 04:28
Последний раз редактировалось Circiter 23.08.2011, 04:44, всего редактировалось 3 раз(а).
Tuples — кортежи. Пример для пары целых чисел: Tuple
P.S.: Не думаю, что это стоит использовать с рекурсией да ещё и в серьезном проекте. 🙂
Re: Как вернуть два массива из метода C#
23.08.2011, 19:28
Интересно, почему вы не рекоммендуете кортежи в серьезных программах?
Похоже кортежи относительно новая конструкция. (в Троелсен мне найти не удалось)
p.s. почему нет проверки орфографии на форуме?
Re: Как вернуть два массива из метода C#
23.08.2011, 20:40
Последний раз редактировалось arseniiv 23.08.2011, 20:54, всего редактировалось 4 раз(а).
Bridgeport в сообщении #477234 писал(а):
p.s. почему нет проверки орфографии на форуме?
Это такой особенный способ рейтинга.
Я тоже думаю, что для смысла нужнее использовать out-параметры. Пока ещё пользователь будет извлекать из вашего кортежа матрицы, а тут р-раз! и всё. Рекурсию тоже не советую. Ударит по скорости создание новых и новых матриц (и кортежей, содержащих их) для каждого возврата из функции.
— Вт авг 23, 2011 23:44:33 —
Bridgeport в сообщении #477234 писал(а):
Интересно, почему вы не рекоммендуете кортежи в серьезных программах?
Да почему же, есть место и им (наверно — пока не придумал — надо знать, чем они отличаются от списков и массивов). Но не здесь.
— Вт авг 23, 2011 23:53:52 —
А, я дурак. Tuple < . >нужны для описания сложных generic’ов!
— Вт авг 23, 2011 23:54:10 —
И где-нибудь около.
Re: Как вернуть два массива из метода C#
23.08.2011, 22:51
Bridgeport в сообщении #477234 писал(а):
Интересно, почему вы не рекоммендуете кортежи в серьезных программах?
Да нет никаких противопоказаний, пользуйтесь на здоровье. В документации написано буквально следующее:
MSDN в статье писал(а):
-
Tuples are commonly used in four ways:
- To represent a single set of data. For example, a tuple can represent a database record, and its components can represent individual fields of the record.
- To provide easy access to, and manipulation of, a data set.
- To return multiple values from a method without using out parameters (in C#) or ByRef parameters (in Visual Basic).
- To pass multiple values to a method through a single parameter. For example, the Thread.Start(Object) method has a single parameter that lets you supply one value to the method that the thread executes at startup time. If you supply a Tuple object as the method argument, you can supply the thread’s startup routine with three items of data.
Только, на мой взгляд, для возврата нескольких значений из метода удобнее описать структуру (struct): по крайней мере, не придется потом мучительно вспоминать, какое значение в каком элементе кортежа Вы возвращаете.
Также не вижу причин не использовать кортежи в качестве возвращаемого значения в рекурсивных методах.
Re: Как вернуть два массива из метода C#
23.08.2011, 23:17
А как же производительность?
Re: Как вернуть два массива из метода C#
23.08.2011, 23:44
arseniiv в сообщении #477287 писал(а):
А как же производительность?
А в чем конкретно Вы видите потерю производительности?
Не думаю, что в каких-то реальных приложениях экономия времени за счет способа возврата результатов работы метода может оказаться существенной.
Re: Как вернуть два массива из метода C#
23.08.2011, 23:50
Я больше про рекурсию. Если она будет глубокой, то будет создаваться много промежуточных матриц. Притом, если метод будет вызываться часто, сборщик мусора может немного не успевать (наверно) за всё новыми и новыми оставленными матрицами, а если они большого размера… то будет медленнее за счёт загрузки/сброса страниц памяти с/на диск.
Re: Как вернуть два массива из метода C#
23.08.2011, 23:56
Последний раз редактировалось Maslov 23.08.2011, 23:57, всего редактировалось 1 раз.
arseniiv в сообщении #477294 писал(а):
Я больше про рекурсию.
Тут Вы, конечно, правы: если рекурсивное решение предполагает копирование большого количества матриц, а итеративное позволяет обойтись одной копией, то последнее будет более эффективным. На саму же рекурсию накладные расходы минимальны.
Re: Как вернуть два массива из метода C#
24.08.2011, 00:25
Еще в кортежах нельзя менять поля, так что придется использовать struct.
Re: Как вернуть два массива из метода C#
10.09.2011, 18:16
Вы можете использовать KeyValuePair
public class GenContainer
public T inner;
>
Сигнатура функции, возвращающей 2 массива будет выглядеть примерно так:
public KeyValuePair
>
При этом сами поля key и value менять будет нельзя, но поле inner, находящееся внутри них, менять будет можно:
KeyValuePair
res.key.inner= new double [N];
res.value.inner= new double [N];
Как вернуть два значения из метода c
Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием return .
Замечание:
Если конструкция return не указана, то функция вернёт значение null .
Использование выражения return
Пример #1 Использование конструкции return
function square ( $num )
return $num * $num ;
>
echo square ( 4 ); // выводит ’16’.
?>?php
Функция не может возвращать несколько значений, но аналогичного результата можно добиться, возвращая массив.
Пример #2 Возврат нескольких значений в виде массива
function small_numbers ()
return [ 0 , 1 , 2 ];
>
// Деструктуризация массива будет собирать каждый элемент массива индивидуально
[ $zero , $one , $two ] = small_numbers ();
?php
// До версии 7.1.0 единственной эквивалентной альтернативой было использование конструкции list().
list( $zero , $one , $two ) = small_numbers ();
Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:
Пример #3 Возврат результата по ссылке
Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно о ссылках.
User Contributed Notes 10 notes
6 years ago
PHP 7.1 allows for void and null return types by preceding the type declaration with a ? — (e.g. function canReturnNullorString(): ?string)
However resource is not allowed as a return type:
function fileOpen ( string $fileName , string $mode ): resource
$handle = fopen ( $fileName , $mode );
if ( $handle !== false )
return $handle ;
>
>
$resourceHandle = fileOpen ( «myfile.txt» , «r» );
?>
Errors with:
Fatal error: Uncaught TypeError: Return value of fileOpen() must be an instance of resource, resource returned.
13 years ago
Developers with a C background may expect pass by reference semantics for arrays. It may be surprising that pass by value is used for arrays just like scalars. Objects are implicitly passed by reference.
# (1) Objects are always passed by reference and returned by reference
class Obj public $x ;
>
function obj_inc_x ( $obj ) $obj -> x ++;
return $obj ;
>
$obj = new Obj ();
$obj -> x = 1 ;
$obj2 = obj_inc_x ( $obj );
obj_inc_x ( $obj2 );
print $obj -> x . ‘, ‘ . $obj2 -> x . «\n» ;
# (2) Scalars are not passed by reference or returned as such
function scalar_inc_x ( $x ) $x ++;
return $x ;
>
$x2 = scalar_inc_x ( $x );
scalar_inc_x ( $x2 );
print $x . ‘, ‘ . $x2 . «\n» ;
# (3) You have to force pass by reference and return by reference on scalars
$x2 =& scalar_ref_inc_x ( $x ); # Need reference here as well as the function sig
scalar_ref_inc_x ( $x2 );
print $x . ‘, ‘ . $x2 . «\n» ;
# (4) Arrays use pass by value sematics just like scalars
function array_inc_x ( $array ) $array < 'x' >++;
return $array ;
>
$array = array();
$array [ ‘x’ ] = 1 ;
$array2 = array_inc_x ( $array );
array_inc_x ( $array2 );
print $array [ ‘x’ ] . ‘, ‘ . $array2 [ ‘x’ ] . «\n» ;
# (5) You have to force pass by reference and return by reference on arrays
$array = array();
$array [ ‘x’ ] = 1 ;
$array2 =& array_ref_inc_x ( $array ); # Need reference here as well as the function sig
array_ref_inc_x ( $array2 );
print $array [ ‘x’ ] . ‘, ‘ . $array2 [ ‘x’ ] . «\n» ;
15 years ago
Be careful about using «do this thing or die()» logic in your return lines. It doesn’t work as you’d expect:
function myfunc1 () return( ‘thingy’ or die( ‘otherthingy’ ));
>
function myfunc2 () return ‘thingy’ or die( ‘otherthingy’ );
>
function myfunc3 () return( ‘thingy’ ) or die( ‘otherthingy’ );
>
function myfunc4 () return ‘thingy’ or ‘otherthingy’ ;
>
function myfunc5 () $x = ‘thingy’ or ‘otherthingy’ ; return $x ;
>
echo myfunc1 (). «\n» . myfunc2 (). «\n» . myfunc3 (). «\n» . myfunc4 (). «\n» . myfunc5 (). «\n» ;
?>
Only myfunc5() returns ‘thingy’ — the rest return 1.
6 years ago
With 7.1, these are possible yet;
function ret_void (): void // do something but no return any value
// if needs to break fn exec for any reason simply write return;
if (. ) return; // break
// return null; // even this NO!
>
$db -> doSomething ();
// no need return call anymore
>
function ret_nullable () ? int if (. ) return 123 ;
> else return null ; // MUST!
>
>
?>
20 years ago
Functions which return references, may return a NULL value. This is inconsistent with the fact that function parameters passed by reference can’t be passed as NULL (or in fact anything which isnt a variable).
if ( testRet () === NULL )
echo «NULL» ;
>
?>
parses fine and echoes NULL
8 years ago
PHP 7 return types if specified can not return a null.
For example:
declare( strict_types = 1 );
function add2ints ( int $x , int $y ): int
$z = $x + $y ;
if ( $z === 0 )
return null ;
>
return $z ;
>
$a = add2ints ( 3 , 4 );
echo is_null ( $a ) ? ‘Null’ : $a ;
$b = add2ints (- 2 , 2 );
echo is_null ( $b ) ? ‘Null’ : $b ;
exit();
Output :
7
Process finished with exit code 139
5 years ago
Be careful when introducing return types to your code.
Only one return type can be specified (but prefacing with ? allows null).
Return values of a type different to that specified are silently converted with sometimes perplexing results. These can be tedious to find and will need rewriting, along with calling code.
Declare strict types using «declare(strict_types=1);» and an error will be generated, saving much head-scratching.
5 years ago
You may specify child return type if there is no parent:
class A public function f ( $a )
return 1 ;
>
>
class B extends A public function f ( $a ): int // + return type, OK
return 1 ;
>
>
class C extends A public function f ( int $a ) // + argument type, WARNING
return 1 ;
>
>
?>
7 years ago
Note: the function does not have «alternative syntax» as if/endif, while/endwhile, and colon (:) here is used to define returning type and not to mark where the block statement begins.
4 years ago
Declaring a collection of objects as return type is not implemented and forbidden:
class Child <>
function getChilds (): Child []
return [(new Child ()), (new Child ())];
>
var_dump ( getChilds ());
// Returns: Parse error: syntax error, unexpected ‘[‘, expecting ‘ ?>
We have to use:
class Child <>
function getChilds (): array
return [(new Child ()), (new Child ())];
>
var_dump ( getChilds ());
// Returns:
/*
array (size=2)
0 =>
object(Child)[168]
1 =>
object(Child)[398]
*/
?>
Idem for function parameter:
function setChilds ( Child [] $childs )<>
// Not allowed
function setChilds (array $childs )<>
// Allowed
?>
- Функции
- Функции, определяемые пользователем
- Аргументы функции
- Возврат значений
- Обращение к функциям через переменные
- Встроенные функции
- Анонимные функции
- Стрелочные функции
- Callback-функции как объекты первого класса
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy