Разница между параметрами ref и out в .NET [дубликаты]

Если у вас есть ключ, который повторяется для каждой строки, вы можете создать декартово произведение с использованием слияния (как в SQL).

from pandas import DataFrame, merge
df1 = DataFrame({'key':[1,1], 'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'key':[1,1], 'col3':[5,6]})

merge(df1, df2,on='key')[['col1', 'col2', 'col3']]

См. здесь документацию: http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational-algebra

398
задан Mike Cole 1 March 2013 в 15:52
поделиться

12 ответов

Они - в значительной степени то же - единственная разница - то, что переменная, которую Вы передаете как out параметр, не должна быть инициализирована, но передача его как ref параметр, это должно быть установлено на что-то.

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error: y should be initialized before calling the method

Ref параметры для данных, которые могли бы быть изменены, out, параметры для данных, это - дополнительный вывод для функции (например, int.TryParse), которые уже используют возвращаемое значение для чего-то.

490
ответ дан Simple Fellow 1 March 2013 в 15:52
поделиться
  • 1
    Я полагаю, что можно думать о форме как о поле с одним концом поля, являющегося исходным цветом и противоположным концом, являющимся конечным цветом. Угол поворачивает угол того поля. Это берет игру вокруг с, но я полагаю, что угол 0 будет | исходный цвет - > конечный цвет | (горизонтально). удите рыбу 90, вероятно, поворачивает поле, по часовой стрелке помещая исходный цвет выше конечного цвета. – Dandre Allison 16 January 2013 в 22:45

Это и касательно Пара-Мертера в C# имеет некоторые хорошие примеры.

обрисованное в общих чертах основное различие - то, что out параметры не должны быть инициализированы, когда передано в, в то время как касательно параметров делают.

0
ответ дан Peter Mortensen 1 March 2013 в 15:52
поделиться

и касательно точно то же за исключением того, что переменные не должны быть инициализированы прежде, чем отправить его в пропасть. Я не настолько умен, я запер это из библиотеки MSDN:).

, Чтобы быть более явным об их использовании, однако, значение модификатора состоит в том, что, если Вы изменяетесь, ссылка той переменной в Вашем коде, и касательно заставит Вашу переменную вызова изменять ссылку также. В коде ниже, переменная генерального директора будет ссылкой на newGuy, как только это возвращается от вызова до doStuff. Если бы не касательно (или) не была бы изменена ссылка.

private void newEmployee()
{
    Person ceo = Person.FindCEO();
    doStuff(ref ceo);
}

private void doStuff(ref Person employee)
{
    Person newGuy = new Person();
    employee = newGuy;
}
0
ответ дан Jacob Proffitt 1 March 2013 в 15:52
поделиться

касательно будет, вероятно, дросселировать на пустом указателе, так как он, по-видимому, ожидает изменять существующий объект. ожидает пустой указатель, так как он возвращает новый объект.

0
ответ дан Joel Coehoorn 1 March 2013 в 15:52
поделиться

Касательно ключевого слова используется для передачи значений ссылкой. (Это не устраняет переданные значения, являющиеся типами значения или ссылочными типами). Выходные параметры, определенные с ключевым словом, для возврата значений из метода.

Одно основное отличие в коде - то, что необходимо установить значение выходного параметра в рамках метода. Дело обстоит не так для касательно параметров.

для получения дополнительной информации взгляд http://www.blackwasp.co.uk/CSharpMethodParameters.aspx

1
ответ дан BlackWasp 1 March 2013 в 15:52
поделиться

out параметры инициализируются названным методом, ref, параметры инициализируются прежде, чем назвать метод. Поэтому out параметры используются, когда просто необходимо получить вторичное возвращаемое значение, ref, параметры используются для получения значения , и потенциально возвращают изменение в том значении (во вторую очередь к основному возвращаемому значению).

1
ответ дан bdukes 1 March 2013 в 15:52
поделиться

Касательно параметров не требуются, чтобы быть установленным в функции, тогда как параметры должны быть связаны со значением прежде, чем выйти из функции. Переменные передали, как может также быть передан функции без того, чтобы быть инициализированным.

4
ответ дан Patrick 1 March 2013 в 15:52
поделиться

, Почему делает C#, имеют и 'касательно' и?

вызывающая сторона метода, который берет параметр, не обязана присваивать переменной, переданной как параметр до вызова; однако, вызываемый обязан присваиваться к параметр перед возвратом.

По контрасту касательно параметров считаются первоначально присвоенными вызывающей стороной. По сути, вызываемый не обязан присваиваться к касательно параметра перед использованием. Касательно параметров передаются и в и из метода.

Так, out средства, в то время как ref для в и.

Они соответствуют тесно [out] и [in,out] параметры COM-интерфейсов, преимущества out параметры, являющиеся тем, вызывающие стороны не должны передавать предварительно выделенный объект в случаях, где это не нужно называемым методом - это избегает и стоимости выделения и любой стоимости, которая могла бы быть связана с маршалингом (более вероятно с COM, но весьма распространенный в.NET).

128
ответ дан Chris Hawkes 1 March 2013 в 15:52
поделиться

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 позволяет Вам быть более точными о значении аргумента, и иногда это может быть намного более эффективно.

82
ответ дан jpaugh 1 March 2013 в 15:52
поделиться

Пример для: Variable получает значение, инициализированное после входа в метод. Позже то же значение возвращается к основному методу.

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            // u can try giving int i=100 but is useless as that value is not passed into
            // the method. Only variable goes into the method and gets changed its
            // value and comes out. 
            int i; 

            a.abc(out i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(out int i)
        {

            i = 10;

        }

    }
}

Вывод:

10

пример ===============================================

для Касательно: Variable должен быть инициализирован перед входом в метод. Позже то же значение или измененное значение будут возвращены к основному методу.

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            int i = 0;

            a.abc(ref i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(ref int i)
        {
            System.Console.WriteLine(i);
            i = 10;

        }

    }
}

Вывод:

    0
    10

=================================

Hope его ясное теперь.

16
ответ дан Arpit Patel 1 March 2013 в 15:52
поделиться
  • Переменная ref должна быть инициализирована перед ее передачей.
  • Переменная out должна быть установлена ​​в вашей реализации функции
  • out параметры могут считаться дополнительными возвращаемыми переменными (не входными)
  • ref параметры можно рассматривать как входные и выходные переменные.
9
ответ дан 22 November 2019 в 23:40
поделиться

out указывает, что параметр является выходными параметрами, т.е. значение, пока оно не будет явно установлено методом.

ref указывает, что значение является ссылкой, имеющей значение, значение которой вы можете изменить внутри метода.

4
ответ дан 22 November 2019 в 23:40
поделиться