2011-02-09 2 views
1

почему в C# мы должны инициализировать переменный тип примитива -Почему в C# нам нужно инициализировать переменную примитивного типа?

static void Main(string[] args) 
{ 
    int a; 
    Console.WriteLine(a); 
} 

броски ошибки компиляции времени ...

+0

Какой еще результат вы ожидаете? –

+2

Это не имеет ничего общего с примитивами. – SLaks

+0

@jsummers: Вероятно, он ожидает '0'. – SLaks

ответ

5

Для того, чтобы предотвратить возможные ошибки кодирования, C# не позволит вам использовать любого локальная переменная, пока компилятор не сможет доказать, что он был инициализирован.

+0

Я хочу знать, почему это ошибка при компиляции .... –

+0

@Pranay: Потому что это то, о чем говорит спецификация. http://msdn.microsoft.com/en-us/library/aa691172%28v=VS.71%29.aspx – SLaks

+0

Это потому, что дизайн-грамматика C# таким образом? –

0

Чисто, потому что это хорошая практика. CLR инициализирует их по умолчанию в любом случае - для ValueTypes.

0

его из функции вывода .... с # не приведение типа статической переменной в отличие от динамической в ​​питона перламутра так, проверяя тип значений, с помощью которого ваша переменная инициализируется тип переменной определяется и проверяется. его сделано во время компиляции

0

Есть еще одна концептуальная причина.

Все в .NET является объектом.

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

Почему C# должен позволить вам выводить на консоль (как в вашем примере) переменную, которая не содержит ничего?

Для меня вопрос: не находите ли вы полезным компилятор C#, препятствующий созданию бесполезного кода? Любая помощь всегда полезна с точки зрения предотвращения человеческих ошибок или неправильной логики.

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

int a; 

if(false) { a = 1; } 

Console.WriteLine(a); 

... не будет компилировать тоже.

Ну, почему компилятор C# должен позволить вам работать со ссылкой на ничего? Любой аргумент будет слабым, так как какая хорошая программа должна писать на консоль ничего? Если вашей программе не нужно печатать, просто не печатайте.

Например, если вы хотите, чтобы сделать это правильно, это должно быть:

int a; 

if(false) { a = 1; } else { a = 0; } 

Console.WriteLine(a); 

«Я хочу, чтобы моя программа, чтобы показать 1, если оно ложно, или 0, если это правда». Но «показать 1, если это ложь, или показать« я не знаю, что », является слабым аргументом.

Это как сказать: «Вы хотите яблоки или пустоту?».

+1

Целое число - это тип значения, а не ссылочный тип. Он имеет значение по умолчанию, оно не указывает ни на что. – Harry

+0

Но для .net, и не говоря о предметах низкого уровня, что-либо является объектом. Я попытался объяснить очень абстрактно. –

+0

Я вижу, где вы собираетесь с этим, но это полон неправильных высказываний.Переменная не является ссылкой на * объект *. Переменная определяется как ссылка на * место хранения *. Место хранения хранит * значение *; значение может быть либо значением типа значения, либо ссылкой на экземпляр ссылочного типа. Null - это * не * объект, null - недопустимая ссылка *; это * значение *. И, наконец, ваша логика очень полезна; почему одна и та же логика не применяется к полям или элементам массива, ни один из которых не требуется явно инициализировать? –

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