Какова цель ключевого слова out у вызывающего абонента (в C#)?
-
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
для ясности. Если бы вы не знаете, не глядя на подпись метода.