Какова цель ключевого слова out у вызывающего абонента (в C#)?

StackOverflow https://stackoverflow.com/questions/1393946

  •  21-09-2019
  •  | 
  •  

Вопрос

Когда функция C# имеет выходной параметр, вы поясняете это следующим образом:

private void f(out OutputParameterClass outputParameter);

Это означает, что параметр не нужно инициализировать при вызове функции.Однако при вызове этой функции вам нужно повторить ключевое слово out:

f(out outputParameter);

Мне интересно, для чего это хорошо.Почему необходимо повторять часть спецификации функции?Кто-нибудь знает?

Это было полезно?

Решение 7

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

Самая важная причина повторения out/ref заключается в том, что если вызываемая вами функция будет реорганизована с другой сигнатурой, вы получите ошибку компиляции.В частности, если параметр переходит из состояния «нет» в состояние «выход», вы сразу об этом узнаете.

Другие советы

Это означает, что вы знаете, что делаете - что вы признаете, что это out параметр. Ты В самом деле Хотите, чтобы совершенно другое поведение произошло молча? То же самое верно для ref, кстати.

(Вы также можете перегружать на основе значения против/ref, но я бы не рекомендовал ее.)

По сути, если у вас есть (непредвзятая) локальная переменная и вы используете ее в качестве аргумента без Out/ref, вы знаете, что значение этой переменной не будет изменено в рамках метода. (Если это переменная эталонного типа, то данные в объекте, к которому он ссылается, могут быть изменены, но это очень по -другому.)

Это избегает такой ситуации, которую вы получаете в C ++, где вы неосознанно Передайте что -нибудь по ссылке, но предположим, что значение не изменилось ...

Это особенность дизайна. Понятно, что это не было необходимым, но это помогает в чтении.

Хотя я не знаю происхождения такого решения, я знаю, что у него есть цель для перегрузки.

Совершенно законно создавать эти две функции в одном классе:

private void f(out OutputParameterClass outputParameter);

а также

private void f(OutputParameterClass outputParameter);

Указание out Ключевое слово при вызове такой перегрузки имеет смысл.

Для читаемости зная, что метод может/будет делать с вашей переменной.

Получил больше информации от MSDN:http://msdn.microsoft.com/en-us/vcsharp/aa336814.aspx

Вызывающий абонент метода, который принимает параметр OUT, не требуется для назначения переменной, переданной в качестве параметра OUT до вызова; Тем не менее, Callee должна назначить параметр Out до возврата.

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

Я думаю, что это вопрос последовательности и ясности.

Очевидно, компилятор мог бы преуспеть без. Тем не менее, с добавлением ключевого слова OUT вы проясняете свои намерения, а код становится более ясным и разборчивым.

Вы, вероятно, должны использовать out для ясности. Если бы вы не знаете, не глядя на подпись метода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top