Подтвердить что ты не робот

С# Почему частичные методы используют ref, но не из?

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

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

4b9b3361

Ответ 1

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

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

Итак, для метода, использующего 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(...);

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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