Почему оба и реф?
out
ссылки на переменные могут быть инициализированы с помощью адреса неназначенной переменной, но ref
переменные не могут этого сделать, делая out
лучше чем ref
, Тогда зачем ref
?
4 ответа
Как вы сказали, что вы знаете о разнице, и поэтому я предполагаю, что вы также знаете о том, что наши аргументы должны быть назначены.
Таким образом, я полагаю, вы хотите знать, почему аргумент должен быть назначен.
Ключевое слово out - это означает, что вы используете этот аргумент для вывода чего-либо.
рассмотрим, int add(int x, inty). Если этот метод не возвращает ничего, он должен работать. Здесь также мы объявляем контракт, что этот метод возвращает целое число. Аналогичным образом, в случае ключевого слова out мы определяем контракт, которому будет присвоена переменная out, которая будет предоставлена в качестве вывода.
Почему мы должны обновить? Это потому, что мы явно помечаем его как аргумент out и, таким образом, мы уверены, что мы собираемся присвоить значение и вернуть его. Если есть сценарий, в котором нам нечего присваивать, и мы все еще используем аргумент, то я уверен, что у нас есть проблемы с дизайном.
ключевое слово ref: - это означает, что вы передаете ссылку. Это никогда не означает, что вы назначите его и предоставите какой-то вывод. Вы можете использовать это таким образом, но это не контракт. У вас есть ссылка на аргумент, и вы можете сделать что-нибудь с ним. В C# аргументы передаются по значению по умолчанию. ref Keyword дает вам возможность передать аргументы по ссылке.
Вы можете получить больше информации о ключевом слове ref здесь.
Надеюсь, это поможет.
Проблема в том, что выходные параметры ДОЛЖНЫ быть либо инициализированы, либо назначены до завершения функции. Это в основном, так что вы не забудьте установить переменную.
static void Method(out int pointer)
{
pointer = 5; //Initialize or assign to fix the error
}
Если вы хотите просто передать параметр в функцию по ссылке, вы должны использовать ref
:
class Program
{
static void Main(string[] args)
{
int integer = 9;
Method(ref integer);
}
static void Method(ref int pointer)
{
}
}
Это скомпилируется нормально.
Насколько я понимаю, что параметры устанавливаются вызываемым методом, а не передаются в метод.
Так что это будет действительным:
class Program
{
static void Main(string[] args)
{
int integer;
Method(out integer);
// integer is now 9
}
static void Method(out int pointer)
{
...
pointer = 9;
}
}
// Option 2:
class Program
{
static void Main(string[] args)
{
int integer = 9;
Method(integer);
}
static void Method(int pointer)
{
//Do something with pointer = 9
}
}