Нет, локальные переменные не имеют значения по умолчанию . Они должны быть определенно присвоены, прежде чем вы их прочтете. Это уменьшает вероятность использования вами переменной думаю, что вы дали разумную ценность, когда на самом деле у нее есть значение по умолчанию. Это невозможно сделать для экземпляров или статических переменных, потому что вы не знаете, в каком порядке будут вызываться методы.
Подробнее см. В разделе 5.3 спецификации C# 3.0.
Обратите внимание, что это не имеет никакого отношения к тому, что это переменная ссылочного типа. Это не будет компилироваться таким же образом:
int i;
if (i == 0) // Nope, i isn't definitely assigned
{
}
Что касается языка, то, во всяком случае ... ясно место хранения в памяти есть что-то в нем, но это нерелевантным и специфичным для реализации. Существует one, вы можете узнать, что это за значение, создав метод с параметром out
, но затем используя IL, чтобы посмотреть на значение этого параметра в методе, не указав ему другое значение. CLR не возражает против этого. Вы можете затем вызывать, что этот метод передается в не определенную определенную переменную, и вот и вы можете обнаружить значение, которое в большинстве случаев будет значением «все нули».
Я подозреваю, что спецификация CLI делает, чтобы локальные переменные имели значение по умолчанию - но я должен был бы проверить. Если вы не делаете злые вещи, как указано выше, это не имеет значения для вас на C#.
В этот момент Bar указывает на место в стеке, а не на кучу. По этой причине ему нужно значение –
И классы инициализируются на куче справа? А структур нет. Верный? – Snake
Но код выполняется в контексте конструктора –