Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Использование типов, допускающих значение null

Типы, допускающие значение null, могут представлять все значения лежащего в их основе типа, а также значение null. Допускающие значение null типы объявляются одним из следующих способов:

System.Nullable<T> variable

–либо–

T? variable

T — это тип, лежащий в основе допускающего значение null типа. Типом T может быть любой тип значения, включая struct, но не может быть ссылочный тип.

Примером случая, когда может использоваться допускающий значение null тип, может служить обычная переменная логического типа, которая может иметь два значения: true и false. Обозначающего "не определено" значения не существует. Во многих программных приложениях, в первую очередь в операциях с базами данных, переменные могут иметь неопределенное состояние. Например, поле базы данных может содержать значение true или false, но может также вообще не содержать какого-либо значения. Аналогично, ссылочные типы могут иметь значение null, обозначающее, что они не инициализированы.

Это несоответствие может создавать дополнительную работу по программированию, приводить к использованию дополнительных переменных для хранения информации о состоянии, применению специальных значений и т.д. Модификатор типа, преобразующий тип в тип, допускающий значения null, позволяет языку C# создавать переменные типа значения, обозначающие неопределенное значение.

Примеры допускающих значение null типов

Любой тип значения может использоваться в качестве основы допускающего значение null типа. Например:

int? i = 10;

double? d1 = 3.14;

bool? flag = null;

char? letter = 'a';

int?[] arr = new int?[10];

The Members of Nullable Types

Each instance of a nullable type has two public read-only properties:

  • HasValue

HasValue is of type bool. It is set to true when the variable contains a non-null value.

  • Value

Value is of the same type as the underlying type. If HasValue is true, Value contains a meaningful value. If HasValue is false, accessing Value will throw a InvalidOperationException.

In this example, the HasValue member is used to test whether the variable contains a value before it tries to display it.

int? x = 10;

if (x.HasValue)

{

System.Console.WriteLine(x.Value);

}

else

{

System.Console.WriteLine("Undefined");

}

Testing for a value can also be done as in the following example:

int? y = 10;

if (y != null)

{

System.Console.WriteLine(y.Value);

}

else

{

System.Console.WriteLine("Undefined");

}

Члены допускающих значение null типов

Каждый экземпляр допускающего значение null типа имеет два общих предназначенных только для чтения свойства:

  • HasValue

Свойство HasValue имеет тип bool. Это свойство имеет значение true, если переменная содержит определенное значение.

  • Value

Свойство Value имеет тот же тип, что и лежащий в основе тип. Если свойство HasValue имеет значение true, то свойство Value содержит имеющее смысл значение. Если свойство HasValue имеет значение false, то доступ к свойству Value будет приводить к формированию ошибки InvalidOperationException.

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

----

Проверка переменной может быть также выполнена способом, показанным в следующем примере:

int? y = 10;

if (y != null)

{

System.Console.WriteLine(y.Value);

}

else

{

System.Console.WriteLine("Undefined");

}

Explicit Conversions

A nullable type can be cast to a regular type, either explicitly with a cast, or by using the Value property. For example:

int? n = null;

//int m1 = n; // Will not compile.

int m2 = (int)n; // Compiles, but will create an exception if x is null.

int m3 = n.Value; // Compiles, but will create an exception if x is null.

If a user-defined conversion is defined between two data types, the same conversion can also be used with the nullable versions of these data types.

Implicit Conversions

A variable of nullable type can be set to null with the null keyword, as shown in the following example:

int? n1 = null;

The conversion from an ordinary type to a nullable type, is implicit.

int? n2;

n2 = 10; // Implicit conversion.