2010-05-08 2 views
0

У меня есть пользовательский-структуру:
C# Странное поведение

struct A 
{ 
    public int y; 
} 

пользовательский класс с пустым constuctor:

class B 
{ 
    public A a; 
    public B() 
    { 
    } 
} 

и здесь является основным:

static void Main(string[] args) 
{ 
    B b = new B(); 
    b.a.y = 5;//No runtime errors! 
    Console.WriteLine(b.a.y); 
} 


Когда я запускаю вышеуказанную программу, это не дает мне ny ошибок, хотя я не инициализировал struct A в конструкторе класса B. .. 'a = new A();'

+1

Я смущен вопросом. Почему вы ожидаете ошибку * runtime *? Я могу понять, почему вы ожидаете ошибки * компиляции-времени *, но почему вы ожидаете ошибку * runtime *? Я подозреваю, что ваша убежденность в том, что ошибка времени выполнения здесь уместна, является симптомом глубокого непонимания того, что означает «тип ценности». Можете ли вы объяснить, почему вы думаете, что это должно быть время выполнения, а не ошибка времени компиляции? Вы также ожидаете ошибку времени выполнения, если тип поля «a» был «double» вместо struct A? Почему или почему нет? –

ответ

7

Я не инициализировал структуру A в конструкторе класса B.

C# делает это за вас. Все члены классов инициализируются значениями по умолчанию, если вы не назначили им другие значения в объявлении или конструкторе.

Для экземпляров class значением по умолчанию является null, и вы получите сообщение об ошибке при использовании этого экземпляра. Тем не менее, для struct экземпляров (не ссылок, в отличие от экземпляров класса), не существует значения null. Значение по умолчанию для struct является экземпляром, где все его поля инициализируются по умолчанию.

Именно поэтому ваш код работает.

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