C#, Почему частичные методы могут использовать касательно, но не?

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

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

19
задан m-y 10 August 2010 в 20:36
поделиться

7 ответов

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

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

Таким образом, для метода, использующего 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(...);
20
ответ дан 30 November 2019 в 03:19
поделиться

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

9
ответ дан 30 November 2019 в 03:19
поделиться

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

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

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

4
ответ дан 30 November 2019 в 03:19
поделиться

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

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

4
ответ дан 30 November 2019 в 03:19
поделиться

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

1
ответ дан 30 November 2019 в 03:19
поделиться

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

1
ответ дан 30 November 2019 в 03:19
поделиться

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

1
ответ дан 30 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: