2014-11-06 3 views
0

Это будет быстрый вопрос. Я не совсем понимаю, почему это происходит, так что я покажу вам, что меня беспокоит с помощью простых примеров ..Объявление и инициализация переменных структуры

Первый пример:

private static Point pt; 

public static void Main(string[] args) 
{ 
    pt.Display(); 
} 

public struct Point 
{ 
    public int X; 
    public int Y; 

    public void Display() 
    { 
     Console.WriteLine("X = {0}, Y = {1}", X, Y); 
    } 
} 

Второй пример:

public static void Main(string[] args) 
{ 
    Point pt; 
    pt.Display(); 
} 

public struct Point 
{ 
    public int X; 
    public int Y; 

    public void Display() 
    { 
     Console.WriteLine("X = {0}, Y = {1}", X, Y); 
    } 
} 

Возможно, мне что-то не хватает, но первый пример компилируется правильно, и я получаю вывод на консоли, а во втором примере он даже не компилируется, потому что:

Локальная переменная 'pt' не может быть инициализирована перед доступом.

Ну, это также не инициализировано в первом случае, но это делает работу, в чем смысл?

P.S. Каламбур не предназначен.

ответ

3

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

+0

О, статическое ключевое слово указывает компилятору на инициализацию переменных по умолчанию? – msmolcic

+0

@ Смола не имеет ничего общего со статикой. это верно для всех полей класса. если у вас есть поле ссылочного типа и не инициализируйте его, вы не получите неинициализированную ошибку, но вы получите исключение NullReferenceException во время выполнения, если попытаетесь получить доступ к его членам, поскольку значение null является значением по умолчанию для ссылочных типов. –

+0

Итак, если я понял, что новый класс, который содержит метод Main, был создан автоматически при запуске моей программы? Так же, как я написал MyClass class = new MyClass(); и он автоматически инициализировал мою структуру Point и ее переменные значениями по умолчанию, но во втором примере это не так, потому что Point не является частным членом моего класса запуска, а локальной переменной внутри моего основного метода? – msmolcic

2

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

Значение «по умолчанию» для структуры является структурой с каждым из своих полей, установленных на значение по умолчанию для его типа, так что вы эффективно получить точку с X и Y значениями (0,0).

Если бы вы объявили Point как class вместо struct вы бы получили NullReferenceException во время выполнения, поскольку ссылка будет иметь нулевое значение, если вы звоните pt.Display().

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