C # Почему частичные методы могут использовать ref, но не out? - PullRequest
19 голосов
/ 11 августа 2010

Довольно прямо. MSDN утверждает, что вы можете использовать ref, но не для частичных методов. Мне просто любопытно, почему почему ? Насколько я понимаю, когда код компилируется, партиалы объединяются, так что же с ограничением? Есть ли у partial нечто большее, чем просто сделать файлы кода более чистыми и организованными (например, eyecandy)?

Ссылка: Статья MSDN - "Частичные методы могут иметь параметры ref , но не out ."

Ответы [ 7 ]

20 голосов
/ 11 августа 2010

Вы должны рассмотреть, что произойдет, если частичный метод не будет реализован.

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

Таким образом, для метода, использующего out, он будет выглядеть так:

stream s;
GetStream(out s);
s.Write(...);

и будет скомпилирован так, как если бы он сказал это:

stream s;
s.Write(...);

Этот код не разрешен, поскольку s имеетне был инициализирован.Гарантия того, что переменная будет инициализирована к тому времени, когда вы попытаетесь вызвать для нее метод Write, была связана с вызовом GetStream.

То же самое с методами, возвращающими данные.Поскольку весь вызов метода просто не скомпилирован, если вы не реализовали частичный метод, вам нужно подумать о том, что вы можете и не можете сделать, и все же оставить код, который вызывает его, допустимым.С точки зрения out и возвращаемых значений, он может оставить вызывающий код недействительным или неполным, поэтому он не допускается.

Что касается ref, то это действительно с момента инициализациизабота по телефонному коду:

stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
    s.Write(...);
9 голосов
/ 11 августа 2010

Поскольку в отличие от параметров ref, выходные параметры ДОЛЖНЫ быть инициализированы до возврата метода. Если частичный метод не реализован (что является допустимым сценарием), как его можно инициализировать?

4 голосов
/ 11 августа 2010

Параметр out предполагает, что вы хотите получить значение вне метода.Если метод не существует, он не может предоставить это значение.

В качестве альтернативы можно было бы явно установить значение переменной в значение по умолчанию (0, ноль и т. Д.) Вместо выполнения вызова метода.Таким образом, переменная все равно будет определенно инициализирована - хотя значение по умолчанию может быть не очень полезным.Я считаю, что команда C # рассмотрела это - она ​​может даже превратиться в будущую версию, кто знает?Лично я сомневаюсь, что это было бы особенно полезно, но такая возможность есть.

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

4 голосов
/ 11 августа 2010

Я думаю, что out параметры не нужно инициализировать, тогда как ref параметры делают.

Если вы использовали параметр out в частичном методе, как C # может проверить, чтопараметр был инициализирован или нет?

1 голос
/ 11 августа 2010

Как и все остальные заявили out параметры должны быть назначены. Чтобы добавить это, будет сгенерирована ошибка компилятора CS0177 ref, с другой стороны, необходимо назначить до совершения вызова.

1 голос
/ 11 августа 2010

Частичный метод разделен на частичные классы. Требуется метод для присвоения значения параметру OUT. Частичные методы могут быть или не быть реализованы. Это будет означать, что несколько фрагментов кода пытаются присвоить значение параметру OUT.

1 голос
/ 11 августа 2010

Я бы предположил, что причина в том, что частичный метод только с сигнатурой (т.е. без реализации) все еще действителен.Если бы у вас был параметр out, метод без реализации всегда вызывал бы ошибку (поскольку ничто не присваивает значение out)

...