Peter Almazov писал(а):
Валерий Лаптев писал(а):
Меня удивляет, почему этого до сих пор не сделали? Это даже не компилятор, это редактор должен следить, БЛИН!!!!!!!!
В Visual Studio 2008 для C# так и сделано (для остальных языков просто не знаю).
Народ, остыньте. Проблема инициализации не в том чтобы отследить факт инициализации, а в том, чтобы она была сделана не более одного раза, а это алгоритмически неразрешимо.
То что сделано в C# есть
перестраховка, там из-за этого некоторые переменные приходится
не один раз инициализировать (что снижает производительность).
Пример:
Следующий код на C# не скомпилируется:
MyStruct x;
if (!TryInit1(ref x) && !TryInit2(ref x) && !TryInit3(ref x))
{
Init4(ref x);
}
Вместо него придётся написать такой:
MyStruct x;
if (!TryInit1(out x) && !TryInit2(out x) && !TryInit3(out x))
{
Init4(out x);
}
а если переменная объявлена как out то код процедур TryInit1, TryInit2, TryInit3 не скомпилируется пока в ней x не проинициализируют. Таким образом, в C# переменная x будет инициализироваться в этом случае от одного до четырёх раз.