Почему оба и реф?

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
    }
}
Другие вопросы по тегам