Довольно прямой. MSDN указывает, что можно использовать касательно, но не для частичных методов. Мне просто любопытно относительно почему? Это было мое понимание, что, когда код компилируется, partials объединяются, поэтому что произошло с ограничением? Есть ли больше к partial
чем просто создание инструмента для очистки файлов кода и организованный (т.е. eyecandy)?
Ссылка: Статья MSDN - "Частичные методы может иметь касательно, но не параметры".
Вы должны подумать, что произойдет, если частичный метод не будет реализован.
Затем происходит то, что все вызовы метода просто удаляются, как будто их никогда не было.
Таким образом, для метода, использующего 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(...);
Поскольку, в отличие от параметров ref, параметры out ДОЛЖНЫ быть инициализированы до возврата из метода. Если частичный метод не реализован (что является допустимым сценарием), как его можно инициализировать?
Параметр out
предполагает, что вы хотите исключить значение из метода. Если метод не существует, он не может предоставить это значение.
В качестве альтернативы можно было бы явно установить для переменной значение по умолчанию (0, ноль и т. Д.) Вместо выполнения вызова метода. Таким образом, переменная все равно будет инициализирована, хотя значение по умолчанию может оказаться не очень полезным. Я считаю, что команда C # обдумала это - возможно, это даже войдет в будущую версию, кто знает? Лично я сомневаюсь, что это было бы особенно полезно, но возможность есть.
На данный момент вы всегда можете использовать вместо него параметр ref
и просто инициализировать переменную вручную перед вызовом любым значением по умолчанию.
Я предполагаю, что параметры out
не нуждаются в инициализации, тогда как параметры ref
требуют.
Если вы использовали параметр out
в частичном методе, как C # мог бы проверить, инициализирован ли параметр или нет?
Я предполагаю, что причина в том, что частичный метод только с подписью (то есть без реализации) все еще действителен. Если бы у вас был параметр out, метод без реализации всегда вызывал бы ошибку (так как ничего не присваивает значение out)
Частичный метод разделен на частичные классы. Требуется метод для присвоения значения параметру OUT. Частичные методы могут быть реализованы или не реализованы. Это будет означать, что несколько фрагментов кода пытаются присвоить значение параметру OUT.
Как уже было сказано, должны быть назначены из
параметров. Добавление этого вызовет ошибку компилятора CS0177 ref
, с другой стороны, должен быть назначен до выполнения вызова.