VB.NET Почему эта подпрограмма объявлена ​​таким образом? - PullRequest
2 голосов
/ 24 ноября 2010

VB.NET 2010, .NET 4

У меня есть основной вопрос: у меня есть подпрограмма, которую я нашел где-то в Интернете, объявленной так:

Public Sub MyFunction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T)) ...

Я задаюсь вопросом о (Of T As Control) части объявления после имени сабвуфера. Я вижу, что T используется позже при указании типа Control и в Action (Of T), но почему это делается именно так, а не просто:

Public Sub MyFunction(ByVal Control As Control, ByVal Action As Action(Of Control)) ...

Что означает эта часть после имени сабвуфера? Какова его цель? Большое спасибо и извините за мое невежество.

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

То есть универсальный метод VB.NET синтаксис объявления:

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

Аналогия - набор отверток с съемные головки. Вы проверяете винт вам нужно повернуть и выбрать правильная головка для этого винта (прорези, Пересекли, снялись) Как только вы вставите правильная головка в отвертке обрабатывать, вы делаете то же самое функция с помощью отвертки, а именно поворачивая винт.

2 голосов
/ 24 ноября 2010

(Of T) - это параметр общего типа, добавление As Control ограничивает тип T для наследования от Control.Вы можете написать метод вторым способом, но вам, вероятно, придется в конечном итоге привести элемент управления к какому-либо унаследованному типу, в лямбда-выражении в действии или в теле MyFunction.Обобщения позволяют избежать этого.

Например:

Sub Main()
    Dim form As New Form()

    Dim textBox As New TextBox
    Dim listBox As New ListBox

    MyFunction(textBox, Sub(c) c.Text = "Hello")
    MyFunction(listBox, Sub(c) c.Items.Add("Hello"))

    MyFunction2(textBox, Sub(c) c.Text = "Hello")
    MyFunction2(listBox, Sub(c) CType(c, ListBox).Items.Add("Hello"))


End Sub

Public Sub MyFunction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T))
    Action(Control)
End Sub

Public Sub MyFunction2(ByVal Control As Control, ByVal Action As Action(Of Control))
    Action(Control)
End Sub

Это не выглядит слишком ценным в тривиальных случаях, но оно неоценимо для более сложных случаев.

1 голос
/ 24 ноября 2010

Как уже говорили другие, это ограниченный общий параметр.Но никто еще не обратился к этой части вашего вопроса:

почему это сделано так

Ответ в действии.Если бы он был просто объявлен как элемент управления, вы бы не смогли сделать что-то подобное, потому что не все элементы управления имеют свойство .Text *:

MyFunction(MyTextBox, Function(t) t.Text = "new value" )

Телофункция просто должна знать, что она работает над каким-либо элементом управления, но действие (Of T), которое вы передаете функции, может захотеть узнать фактический тип элемента управления.

Да,все элементы управления имеют свойство .Text.Давайте на мгновение представим, что некоторые не

...