Иллюстрированный самоучитель по Visual Basic .NET

Is и Nothing. TypeName и TypeOf.

Оператор Is проверяет, ссылаются ли две объектные переменные на одну область памяти. Следующий фрагмент в обоих случаях выводит True, поскольку в результате операций присваивания все объектные переменные ссылаются на одну область памяти:

Dim Object1 As New Object()
Dim Object2 As New Object()
Dim Object3 As New Object()
ObjectZ =Object1
Objects Object2
Console.WriteLine(Objectl Is Object2)
Console.WriteLine(Object1 Is Object3)

Как и в прежних версиях VB, присваивание объектной переменной значения Nothing разрывает ее связь с блоком памяти. Когда объектная переменная равна Nothing, она не ассоциируется ни с каким объектом. В этом состоянии находятся все объектные переменные, которые были объявлены в программе, но еще не инициализировались. В программе часто встречаются проверки следующего вида:

If anObject Is Nothing Then
' Переменная не связана с объектом, присвоить значение
Else
' Значение было присвоено ранее
End If

Дополнительная информация о том, что происходит при присваивании объектным переменным значения Nothing, приведена в разделе "Сборка мусора и завершение".

TypeName и TypeOf

Переменные, объявленные с типом Object, могут использоваться для хранения произвольных объектов. Следовательно, программисту необходимы средства для определения типа объекта, связанного с объектной переменной. В VB.NET эта задача решается двумя способами: функцией TypeName и оператором TypeOf…Is.

Функция TypeName возвращает строку с описанием типа. Для всех типов, кроме базовых, должен быть предварительно вызван оператор New; в противном случае функция возвращает строку Nothing. Например, следующий фрагмент выводит в консольном окне строку Nothing:

Dim anSBuilder As System.Text.StringBuilder
Console.WriteLineC'My type name is " & TypeName(anSBuilder))

Но после вызова New в окне будет выведена строка StringBuilder:

Dim anSBuilder As New System.Text.StringBuilder
Console.WriteLineC'My type name is " & TypeName(anSBuilder))

Функция TypeName возвращает короткое имя класса, поэтому не рассчитывайте получить полное имя вида System.Text.StringBuilder.

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

Dim aThing(5)As Integer
Console.WriteLine("My type Harness " & TypeName(aThing))

Полученная строка имеет вид Integer().

Функция TypeName удобна в процессе отладки, но в окончательных версиях программ обычно используется оператор TypeOf…Is. Он работает гораздо эффективнее, поскольку обходится без сравнений строк, необходимых при использовании TypeName. Синтаксис проверки выглядит следующим образом:

If TypeOf aThing Is System.Text.SthngBuilder Then
' Объект относится к типу StringBuilder End If

Примечание
Оператор TypeOf…Is возвращает True, если объект относится к заданному типу или является производным от него. Поскольку в .NET все объекты являются производными от общего предка Object проверка вида TypeOf…Is Object всегда возвращает True, даже если переменная относится к типу, производному от Object. Если вам потребуется узнать точный тип объектной переменной, воспользуйтесь методом GetType
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.