Используя ключевое слово в c # - PullRequest
3 голосов
/ 10 октября 2011

Может кто-нибудь подсказать мне точное использование ключевого слова out в качестве параметра и как оно связано для возврата нескольких значений из функции, как в этом POST , я запутался с нашей переменной с нормальной переменной. может ли кто-нибудь помочь мне в этом.

Ответы [ 8 ]

11 голосов
/ 10 октября 2011

Это часто сбивает с толку, и я думаю, что документация MSDN на самом деле немного "понятна, только если уже известна".То есть, это правильно, но это действительно имеет смысл, только если вы уже поняли концепцию.

Вот как я об этом думаю.

Обычный параметр делает копию значение аргумент .Когда вы говорите:

static int M(int z) { z = z + 1; return z; }    
...
int x = 123;
int y = M(x);

Это так же, как вы сказали:

int x = 123;
int z = x; // make a copy of x
z = z + 1;
int y = z;

Параметр ref или out создает псевдоним для существующей переменной .Когда вы говорите

static void N(ref int q) { q = q + 1; }    
...
int x = 123;
N(x);

Это то же самое, что сказать:

int x = 123;
// MAGIC: q is now an another name for variable x
q = q + 1;

q и x являются двумя разными именами , которые относятся к та же переменная .Увеличение q также увеличивает x, потому что они одинаковы.z и x в предыдущем примере - это два разных имени , которые ссылаются на две разные переменные .Увеличение z не меняет x.

Подводя итог: «out» и «ref» просто означают «не создают новую переменную, скорее, временно создают второе имя для существующей переменной».

Это теперь понятно?

ОБНОВЛЕНИЕ: Я не сказал, в чем разница между "out" и "ref".Разница проста.На стороне «вызывающего», «ref» должен быть определенно назначенной переменной до вызова метода.«Вне» не должно быть.На стороне «вызываемого» «ref» может быть прочитан до того, как он записан, но «out» должен быть записан до того, как он будет прочитан.Кроме того, перед выходом из метода должен быть записан «out».

3 голосов
/ 10 октября 2011

Документация MSDN уже проделала большую работу, объясняя это:

Ключевое слово out вызывает передачу аргументов по ссылке.Это похоже на ключевое слово ref, за исключением того, что ref требует инициализации переменной перед передачей.Чтобы использовать параметр out, и определение метода, и вызывающий метод должны явно использовать ключевое слово out.Например:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}
2 голосов
/ 10 октября 2011

Он очень часто используется в шаблоне, который «пытается» получить значение, например:

int result;
if(Int32.TryParse("123", out result))
{
   Console.WriteLine(result + 1);
}
1 голос
/ 10 октября 2011

MSDN всегда хорошее место для старта

1 голос
/ 10 октября 2011

out ключевое слово следует использовать, если вы хотите: a) Разрешить вашей функции изменять конкретную переменную из стека вызывающего кода И б) принудительно установить значение этой переменной внутри вашей функции

0 голосов
/ 10 октября 2011

В большинстве языков c # вы можете передавать значения двумя способами: по значению и по ссылке.

по значению дает методу копию ваших данных, поэтому изменение данных не повлияет на исходные данные

по ссылке, по сути, дает методу адрес памяти ваших данных, поэтому, если метод изменяет данные, он меняет оригинал.

Out - это специальный тип ref, в котором вам не нужно инициализировать переменную перед вызовом метода, он может быть вызван с передачей null. Он ДОЛЖЕН быть установлен методом.

Другой способ, которым вы можете думать об этом (с точки зрения внешнего кода):

val = только для чтения

ref = чтение / запись

out = только запись.

0 голосов
/ 10 октября 2011

Хорошо,

Давайте рассмотрим обычный шаблон для такого рода функции - TrySomething.Предположим, у вас есть функция, которая может преуспеть, давая вам значение или нет, но вы не будете использовать исключение для этого, потому что вы не хотите накладных расходов или это общая черта.Тогда вы обычно возвращаете true, если метод успешен, и false, если нет.Но куда бы вы поместили свое выходное значение?

Один из возможных ответов - использовать параметр out, подобный следующему:

bool TrySomething(MyInputType input, out MyOutputType output)
{
   output = default(MyOutputType);
   /* ... Try getting the answer ... */
   if (!successful)
      return false;

   output = successfulOutput;
   return true;
}

Примечание: Или вы можете рассмотреть возможность использования Tuple<bool,MyOutputType>F # интерпретирует вышеприведенный шаблон как результат создания такого кортежа.

0 голосов
/ 10 октября 2011

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

out ключевое слово хорошо, если вы хотите вернуть несколько значений предопределенных типов (например, int, List<string> и DateTime), и вы не хотите создавать новое класс только для этой цели.

...