Однозначное присваивание

Правила однозначного присваивания запрещают использование переменных, которым не было присвоено значение. Рассмотрим следующий пример:

// Ошибка

using System;

class Test

{

public static void Main()

{

int n;

Console.WriteLine("Value of n is {0}", n);

}

}

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

По тем же соображениям не допускаются операции с неинициализированными переменными класса:

// Ошибка

using System;

class MyClass

{

public MyClass(int value)

{

this.value = value;

}

public int Calculate()

{

return(value * 10);

}

public int value;

}

class Test

{

public static void Main()

{

MyClass mine;

Console.WriteLine("{0}", mine.value); // Ошибка

Console.WriteLine("{0}", mine.Calculate()); // Ошибка

mine = new MyClass(12);

Console.WriteLine("{0}", mine.value); // Теперь порядок

}

}

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

Структура инициализируется либо вызовом конструктора, либо присваиванием значений всем ее переменным перед использованием:

using System;

struct Complex

{

public Complex(float real, float imaginary)

{

this.real = real;

this.imaginary = imaginary;

}

public override string ToString()

{

return(String.Format("({0}, {0})", real, imaginary));

}

public float real;

public float imaginary;

}

class Test

{

public static void Main()

{

Complex myNumber1;

Complex myNumber2;

Complex myNumber3;

myNumber1 = new Complex();

Console.WriteLine("Number 1: {0}", myNumber1);

myNumber2 = new Complex(5.0F, 4.0F);

Console.WriteLine("Number 2: {0}", myNumber2);

myNumber3.real = 1.5F;

myNumber3.imaginary = 15F;

Console.WriteLine("Number 3: {0}", myNumber3);

}

}

В первой секции myNumber1 инициализируется вызовом new. Не забывайте: у структур не бывает конструктора по умолчанию, поэтому этот вызов ничего не делает; он нужен только для того, чтобы экземпляр был помечен как инициализированный.

Во второй секции myNumber2 инициализируется обычным вызовом конструктора.

В третьей секции nyNumber3 инициализируется присваиванием значений всем переменным экземпляра. Разумеется, этот вариант возможен лишь в том случае, если все переменные объявлены открытыми.

Предлагаю ознакомиться с аналогичными статьями: