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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование допускающих значение 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.

 


Явные преобразования

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

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.

Если определенное пользователем преобразование определено между двумя типами данных, то это же преобразование может быть также использовано с допускающими значение NULL версиями этих типов данных.

Неявные преобразования

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

int? n1 = null;

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

int? n2; n2 = 10; // Implicit conversion.

 


Operators

The predefined unary and binary operators and any user-defined operators that exist for value types may also be used by nullable types. These operators produce a null value if the operands are null; otherwise, the operator uses the contained value to calculate the result. For example:

int? a = 10; int? b = null;   a++; // Increment by 1, now a is 11. a = a * 10; // Multiply by 10, now a is 110. a = a + b; // Add b, now a is null.

When performing comparisons with nullable types, if one of the nullable types is null, the comparison is always evaluated to be false. It is therefore important not to assume that because a comparison is false, the opposite case is true. For example:

int? num1 = 10; int? num2 = null; if (num1 >= num2) { System.Console.WriteLine("num1 is greater than or equal to num1"); } else { // num1 is NOT less than num2 }

The conclusion in the else statement is not valid because num2 is null and therefore does not contain a value.

A comparison of two nullable types which are both null will be evaluated to true.

 


Операторы

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

ß---

Если при выполнении сравнения с допускающими значение NULL типами один из допускающих значение NULL типов содержит null, то результатом сравнения всегда является false. Следовательно, важно не считать, что если результатом сравнения является false, то противоположным случаем является true. Например:

int? num1 = 10; int? num2 = null; if (num1 >= num2) { System.Console.WriteLine("num1 is greater than or equal to num1"); } else { // num1 is NOT less than num2 }

Заключение в инструкции else является недопустимым, потому что num2 содержит null и, следовательно, не содержит какого-либо значения.

Сравнение двух допускающих значение NULL типов, оба из которых содержат null, будет давать результат true.

 


The?? Operator

The?? operator defines a default value that is returned when a nullable type is assigned to a non-nullable type.

int? c = null;   // d = c, unless c is null, in which case d = -1. int d = c?? -1;

This operator can also be used with multiple nullable types. For example:

int? e = null; int? f = null;   // g = e or f, unless e and f are both null, in which case g = -1. int g = e?? f?? -1;

The bool? type

The bool? nullable type can contain three different values: true, false and null.

Nullable Booleans are like the Boolean variable type that is used in SQL. To ensure that the results produced by the & and | operators are consistent with the three-valued Boolean type in SQL, the following predefined operators are provided:

bool? operator &(bool? x, bool? y)

bool? operator |(bool? x, bool? y)

The results of these operators are listed in the following table:

 


Оператор??

Оператор?? определяет значение по умолчанию, возвращаемое при присвоении допускающего значение NULL типа не допускающему значение NULL типу.

int? c = null;   // d = c, unless c is null, in which case d = -1. int d = c?? -1;

Этот оператор может также использоваться с несколькими допускающими значение NULL типами. Например:

int? e = null; int? f = null;   // g = e or f, unless e and f are both null, in which case g = -1. int g = e?? f?? -1;

Тип bool?

Допускающий значение NULL тип bool? может содержать три значения: true, false и null.

Допускающие значение NULL логические типы аналогичны логическим типам переменных, используемым в языке SQL. Для обеспечения согласованности результатов выполнения операторов & и | с имеющим три значения логическим типом языка SQL предусмотрены следующие предварительно определенные операторы:

bool? operator &(bool? x, bool? y)

bool? operator |(bool? x, bool? y)

Результаты выполнения этих операторов приведены в следующей таблице:

 


 

X y x&y x|y
True true True true
True false False true
True null Null true
False true False true
False false False false
False null False null
Null true Null true
Null false False null
Null null Null null

 


 

X y x&y x|y
true true true true
true false false true
true null null true
false true false true
false false false false
false null false null
null true null true
null false false null
null null null null

 



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 136; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.180.76 (0.02 с.)