2013-09-21 7 views
1

В следующем коде Resharper 8 сообщает мне, что _myClasses имеет «Возможное» исключение System.NullReferenceException ». Является ли это ошибкой в ​​Resharper или что-то мне не хватает о том, как этот код будет работать? Я понимаю, что модификатор readonly делает это так, что я могу только установить _myClasses один раз, и одна вещь, которую я устанавливаю, является экземпляром чего-то. Какой сценарий может быть нулевым?Почему resharper думает, что частная переменная readonly может быть нулевой?

private readonly IList<MyClass> _myClasses = new List<MyClass>(); 

void Foo() 
{ 
    _myClasses.Clear(); // Possible 'System.NullReferenceException' 
} 
+0

в случае инициализации до нуля в первый раз – Damith

ответ

2

readonly означает "не может изменить после конструктора завершен". Таким образом, любой конструктор может изменить свое значение на null (теперь или на будущий письменный конструктор).

... присвоения полям, введенным декларацией, могут возникать только как часть объявления или в конструкторе того же класса.

Пример:

class Foo 
{ 
    private readonly string myClasses = "test"; 

    public Foo(int value) { }  
    public Foo(string text) { myClasses = text;}  
    public Foo() 
    { 
    myClasses = null; 
    Bar(); 
    } 

    void Bar() 
    { 
    if (myClasses == null) 
    { 
    Console.WriteLine("Null???"); 
    } 
    } 
} 

В образце выше Foo() конструктора будет задавать myClasses для null и случай исключение, если один полагается на это значение не может быть пустым.

+0

Ключом, который мне не хватало, было то, что я не понимал, что readonly может быть установлен несколько раз. Я думал, что он может быть установлен только в/перед конструктором и может быть установлен только один раз за это время. –

+0

Проблема в том, что даже если у вас нет конструктора 'Foo()' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', то Resharper все равно скажет вам, что член может быть 'null'. –

Смежные вопросы