Почему я НЕ получаю предупреждений о неинициализированных полях только для чтения?C#

Место общения программистов C#
Ответить
Anonymous
 Почему я НЕ получаю предупреждений о неинициализированных полях только для чтения?

Сообщение Anonymous »

Компилятор C# любезно выдает вам предупреждение «поле никогда не присваивается», если вы забудете инициализировать член, доступный только для чтения, который является закрытым или внутренним, или если класс, в котором он объявляется, является внутренним. Но если класс является общедоступным, а член только для чтения является общедоступным, защищенным или защищенным внутренним, то никаких предупреждений для вас!

Кто-нибудь знает, почему?

Пример кода, демонстрирующий условия, при которых выдается предупреждение, и условия, при которых предупреждение не выдается:

Код: Выделить всё

namespace Test1
{
class Test1
{
#if TRY_IT
public readonly int m; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0
protected readonly int n; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0
internal readonly int o; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0
private readonly int p; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0
protected internal readonly int q; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0

Test1()
{
if( p != 0 ) //To avoid warning 'The field is never used'
return;
}
#endif
}

public class Test2
{
#if TRY_IT
private readonly int m; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0
internal readonly int n; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0

Test2()
{
if( m != 0 ) //To avoid warning 'The field is never used'
return;
}
#endif
public readonly int o; //Blooper: no warning about field never assigned to.
protected readonly int p; //Blooper: no warning about field never assigned to.
protected internal readonly int q; //Blooper: no warning about field never assigned to.
}

public sealed class Test3
{
public readonly int m; //Blooper: no warning about field never assigned to.
}
}
РЕДАКТИРОВАТЬ: На мгновение вы можете подумать, что компилятор воздерживается от выдачи предупреждения в случае открытых и защищенных членов, потому что это разумно. ожидать, что производные классы могут инициализировать поле. Эта теория не выдерживает никакой критики по ряду причин:
  • Внутренний класс может быть подклассом, но компилятор этого не делает.
    В этом случае воздержитесь от выдачи предупреждения.
  • Компилятор не может выдать предупреждение даже в случае запечатанного
    класса, как показывает Test3 в примере кода.
  • Предупреждение имеет смысл ради целостности базового
    класса независимо от того, что может или не может делать производный класс.
    Классу явно запрещено инициализировать
    член базового класса, доступный только для чтения. (Спасибо, Джим Мишел.)
EDIT2: Если моя память мне не изменяет, Java выдает все необходимые предупреждения во всех случаях, независимо от того, является ли неинициализированный конечный член общедоступным, защищенным или частным, а также независимо от того, является ли содержащий его класс общедоступным или видимым только внутри его пакета.

Подробнее здесь: https://stackoverflow.com/questions/868 ... nly-fields
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»