ПОНЯТНО О Visual Basic NET (том 2)

Пользуемся подсказкой, чтобы узнать объектные типы


Для новичка функции, переменные, параметры объектного типа непривычны. И мы будем привыкать к ним постепенно, по мере надобности. А чтобы не отвыкнуть, не успев привыкнуть, нам нужно научиться для начала обеспечивать совместимость, быстро узнавать забытый тип и т.д. Ведь классов, их свойств и методов (да еще и параметров этих методов) в библиотеке классов .NET Framework огромное количество, всех не упомнишь. И если VB жалуется, например, на несоответствие типу параметра для забытого нами метода какого-то класса, то мы должны хотя бы иметь возможность где-то узнать, что это за тип.

Рассмотрим на простейшем примере, как для этого пользоваться подсказкой. Пусть мы, например, хотим покрасить метку в красный цвет, но забыли, как это делается. В результате мы не знаем, как правильно написать – так:

        Label1.BackColor = Color.Red

так:

        Label1.BackColor = Brushes.Red

или так:

        Label1.BackColor = Pens.Red

VB путем подчеркивания вежливо подсказывает нам, что два последних варианта неверны. Но мы не понимаем, почему. И хотим знать, чтобы не ошибаться в дальнейшем. Такое желание достойно уважения и его необходимо удовлетворить.

Источник многих ошибок – несоответствие типов. Поэтому нам для начала нужно точно знать тип каждого элемента в написанных строках. Потренируемся. Начнем с правильной строки.

Label1.BackColor = Color.Red. Поставим мышь на слово Label1. Всплывает подсказка:

Friend Dim WithEvents  Label1  As  System.Windows.Forms.Label

Что это такое? Не обращаем внимания на слова Friend и WithEvents. Остается

Dim  Label1  As  System.Windows.Forms.Label



Это не что иное, как объявление метки. Мы его не делали, VB сделал его сам в скрытой части окна кода (см. 6.1.3). Мы видим, что метка Label1 имеет тип System.Windows.Forms.Label, то есть принадлежит классу Label, входящему в пространство имен System.Windows.Forms.

Поставим мышь на слово BackColor. Всплывает подсказка:

Public Overridable Overloads Property BackColor() As System.Drawing.Color


Не обращаем внимания на слова Public Overridable Overloads. Остается
Property BackColor() As System.Drawing.Color
Слово Property означает «свойство». Это не что иное, как подсказка о типе свойства BackColor. Мы видим, что свойство метки BackColor имеет тип System.Drawing.Color, то есть является структурой Color, входящей в пространство имен System.Drawing.
Не задавайте мне сейчас вопросов, вроде «Как может цвет быть какой-то там структурой?» или других вопросов о «смысле». Вам даже не нужно понимать, похожа ли структура на объект. Понимание таких вещей придет к нам позднее. Сейчас нам важно уяснить следующее: Некоторый элемент (в нашем случае – свойство BackColor) может принадлежать
одному классу или объекту (Label1), а его значение может иметь тип совсем другого класса, объекта или чего-нибудь еще (структура Color). Всегда помните эту разницу. Это нормально. Это в порядке вещей.
Поставим мышь на слово Color. Всплывает подсказка:
Structure Color
Здесь все понятно.
Далее. У структуры Color есть свойства и одно из них стоит после точки. Поставим мышь на слово Red. Всплывает подсказка:
Public Shared Overloads ReadOnly Property Red() As System.Drawing.Color
Не обращаем внимания на слова Public Shared Overloads ReadOnly. Получается
Property Red() As System.Drawing.Color
Мы видим, что Red – это свойство структуры  Color  и оно же имеет тип Color, то есть тип той же самой структуры. А почему бы и нет, Семен Семеныч Семенов? Опять же, пока важно не это.
Оператор присваивания  Label1.BackColor = Color.Red  присваивает свойству BackColor объекта Label1 свойство Red структуры Color. Мы только что убедились, что типы обоих свойств совпадают, а это значит, что совместимость типов соблюдена и присвоение прошло без осложнений.
Label1.BackColor = Brushes.Red. Теперь посмотрим, к чему придирается VB в операторе Label1.BackColor = Brushes.Red. Что касается левой части оператора, то там все то же, что и в правильной строке. Посмотрим на подчеркнутую правую часть.
Поставим на нее мышь. Всплывает подсказка, относящаяся ко всей подчеркнутой части ошибочного оператора и в ней мы скоро разберемся. Но нам сначала хотелось бы узнать, что это за  Brushes  такие. Предположим, что мы это забыли.


Чтобы вспомнить, мы можем воспользоваться средствами помощи или Object Browser, как мы это делали в 6.2.8. Я поступлю проще – напишу какой-нибудь правильный оператор, в котором выражение Brushes.Red не будет подчеркнуто, и поставлю мышь на слово Brushes. Всплывает подсказка:
Class Brushes
Все ясно. Это класс с именем Brushes.
Поставим мышь на слово Red. Всплывает подсказка:
Public Shared Overloads ReadOnly Property Red() As System.Drawing.Brush
Она единственным (самым правым) словом отличается от аналогичной подсказки для свойства Red  структуры Color. Но это слово решает все.
Мы видим, что в данном случае Red  – это свойство класса Brushes, и оно имеет тип Brush. Класс Brushes и класс Brush  – это разные классы и вы не должны их путать, несмотря на то, что их похожее написание провоцирует спекуляции на тему некоей смысловой связи этих классов. Чтобы правильно пользоваться обоими классами, нет никакой необходимости вникать в наличие или отсутствие этой связи.
Мы видим, что свойство Red  принадлежит классу Brushes, а само имеет значение совсем другого типа – класса Brush. Тоже в порядке вещей. Привыкайте.
Главный вывод таков. Неправильный оператор присваивания пытается присвоить свойству BackColor, имеющему тип Color,  свойство Red, имеющее тип Brush. Типы не совпадают и VB бессилен их совместить.
Поставим мышь на подчеркнутую правую часть. Всплывает подсказка
Value of type 'System.Drawing.Brush' cannot be converted to 'System.Drawing.Color'
Переводится подсказка так:
«Значение типа Brush  не может быть преобразовано в тип Color».
Как видите, для понимания причин несовместимости нам совсем не понадобилось изучать класс Brush  и даже знакомиться с ним.
Label1.BackColor = Pens.Red. Аналогично можете убедиться в неправильности третьей строки, где свойство Red знакомого нам класса Pens имеет неведомый нам тип Pen, то есть его значение принадлежит классу Pen.
Получается не очень логичная с точки зрения здравого смысла вещь: Красный – он и в Африке красный. Зачем же тогда свойство Red разных классов имеет разный тип? Поймете, когда будете писать свои классы.

Содержание раздела