C # имеет out
и ref
ключевые слова. Почему эти два необходимы? Отказ от ответственности: у меня нет глубоких знаний C #.
c#
parameters
keywords
Нео
источник
источник
ref
иout
? Или вы спрашиваете, что такое использование аргументов по ссылкамref
/out
по сравнению с аргументами по значению (без модификатора параметра)? Или оба?Ответы:
С точки зрения реализации они, по сути, одно и то же, но
out
сообщают о чем-то, чтоref
не имеет значения: вас не волнует вклад. Это означает определенные вещи для вас и для инструментов. Например, вы можете передать неинициализированную переменнуюout
параметру, и это не проблема, где бы это было иначе, и внутри функции вы должны присвоить значениеout
параметру до его возврата, тогда как нет необходимости делать что-либо в все соref
значением.источник
out
дает ему способ сделать это, который лучше всего соответствует тому, как вы хотите работать с переменными в первую очередь.out
параметру, потому что функция, получающая его, не будет читать из него ,Чтобы понять эти два ключевых слова, вам нужно понять, что означает передача значения по ссылке . По сути, это означает, что если вы изменяете переменную параметра, которую вы передаете в метод или функцию, эта переменная сохраняет свое измененное значение при выходе из функции. Объявление параметра как
ref
илиout
выполнение этого, тогда как обычная переменная параметра сохранит свое первоначальное значение, даже если вы изменили его в функции.Единственное различие между
ref
иout
заключается в том,out
что вам не нужно инициализировать переменную перед тем, как передать ее в функцию, ноref
это необходимо; в то время какout
действительно требуют , чтобы назначить что - то к переменной внутри функции, ноref
не делает.источник
Ты спрашивал.
И ответ заключается в том, что они НЕ ТРЕБУЮТСЯ, например, java не имеет ни одного, а VB имеет только ref (и требует этого только в объявлении метода).
Вы можете легко написать целую программу, не используя ни того, ни другого.
Они существуют, потому что они иногда полезны. Вот почему их два, а не только один - потому что полезно проводить различие между «здесь есть что-то, измените его, если хотите» и «придайте этой вещи новое значение».
Другие языки имеют разные приоритеты и могут включать или не включать их или эквивалентные. Они могут даже не согласиться с тем, является ли один из них полезным, и поэтому могут активно решать НЕ реализовывать одно или другое.
источник
По своей сути , как
ref
иout
обеспечить механизм для передачи адреса переменных к способу , так что он может быть обновлен - назначение наref
илиout
параметр обновляет переменную в контексте вызывающего абонента. В чем они отличаются, так это в гарантиях:out
гарантий, что переменная будет обновлена,ref
нет.С другой стороны вызова есть аналогичные различия.
out
Параметр нашего метода не гарантируется содержит ничего полезного по прибытии и должен быть установлен на значение в какой - то момент, в то время какref
параметр можно предположить , что он имеет значение , и мы не должны делать ничего конкретного с ним.Это различие влияет на анализ, генерацию и оптимизацию кода, которые, в большинстве случаев, не слишком очевидны для нас, но могут повлиять на работу наших программ. Генератор кода может отложить выделение переменной до момента, предшествующего вызову, оптимизатор может решить, что он может более эффективно переупорядочить некоторые операции на основе контракта и т. Д.
С точки зрения использования: как общее правило, я использую
out
для ситуаций, когда меня не волнует содержание переменной, когда она поступает в качестве параметра иref
когда я делаю.источник