ref
и out
оба позволяют вызываемому методу изменить параметр. Различие между ними - то, что происходит прежде , Вы выполняете вызов.
ref
средства, что параметр имеет значение на нем прежде вход в функцию. Вызванная функция может считать и или изменить значение любое время. параметр входит, затем выходит
out
средства, что параметр не имеет никакого официального значения перед входом в функцию. Вызванная функция должна инициализировать его. параметр только выходит
, Вот мой любимый способ посмотреть на него: ref
должен передать переменные ссылкой. out
должен объявить вторичное устройство возвращаемое значение для функции. Это похоже, если Вы могли бы записать это:
// This is not C#
public (bool, string) GetWebThing(string name, ref Buffer paramBuffer);
// This is C#
public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);
Вот более подробный список эффектов каждой альтернативы:
ref
: вызывающая сторона должна установить значение параметра прежде, чем передать его вызываемому методу.
out
: метод вызывающей стороны не требуется установить значение аргумента прежде, чем назвать метод. Скорее всего, Вы не были должны. На самом деле любое текущее значение отбрасывается.
ref
: вызываемый метод может считать аргумент в любое время.
out
: вызываемый метод должен инициализировать параметр прежде, чем считать его.
ref
: текущее значение упорядочивается к удаленному вызову. Дополнительная производительность стоится.
out
: Ничто не передается удаленному вызову. Быстрее.
С технической точки зрения, Вы могли всегда использовать ref
вместо [1 114], но out
позволяет Вам быть более точными о значении аргумента, и иногда это может быть намного более эффективно.
C ++ был представлен как надмножество C. Структуры были перенесены из C, где семантика их членов была общедоступной. Существует огромное количество кода C, включая библиотеки, которые также хотели работать с C ++, которые используют структуры. Классы были введены в C ++, и, чтобы соответствовать философии инкапсуляции объектно-ориентированного программирования, их члены по умолчанию являются закрытыми.
Поскольку класс является обычным способом выполнения объектной ориентации, это означает, что переменные-члены должны быть частными и иметь открытые методы доступа - это хорошо для создания низкой связи . С другой стороны, структуры должны быть совместимы со структурами C, которые всегда являются общедоступными (в C нет понятия публичного и частного) и не используют методы доступа / мутаторы.
Возможно, для обратной совместимости со структурами C. Таким образом, структуры, объявленные в коде C, будут продолжать работать таким же образом при использовании в коде C ++.