Студопедия
rus | ua | other

Home Random lecture






Инициализаторы набора


Date: 2015-10-07; view: 351.


Распространенная в .NET практика — создание экземпляра набора с последующим его заполнением вызовом метода Add для каждого элемента:

Dim digits As New List(Of Integer)

digits.Add(0)

digits.Add(1)

digits.Add(2)

digits.Add(3)

digits.Add(4)

digits.Add(5)

digits.Add(6)

digits.Add(7)

digits.Add(8)

digits.Add(9)

Но в результате для крайне простой концепции мы получаем слишком большие издержки из-за синтаксиса. В Visual Basic 2010 введена поддержка инициализаторов набора, упрощающих создание экземпляров наборов. При использовании такого кода:

Dim digits = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

компилятор сам генерирует все вызовы метода Add. Вы также можете использовать эту функциональность с помощью синтаксиса As New:

Dim digits As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

Заметьте, что группа Visual Basic всегда рекомендует использовать второй синтаксис (As New), так как он делает код устойчивым к изменению настройки Option Infer.

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

  • Набор можно перебирать с помощью оператора For Each, т. е. он реализует IEnumerable. (Более подробное и точное описание типа-набора см. в разделе 10.9.3 спецификации языка Visual Basic по ссылке msdn.microsoft.com/library/aa711986(VS.71).aspx.)
  • У него есть доступный (необязательно открытый) конструктор без параметров.
  • У него есть доступный (необязательно открытый) метод экземпляра или расширения с именем Add.

Это означает, что вы можете использовать инициализаторы набора и с более сложными типами, такими как словари:

Dim lookupTable As New Dictionary(Of Integer, String) From

{{1, "One"},

{2, "Two"},

{3, "Three"},

{4, "Four"}}

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

Dim lookupTable As New Dictionary(Of Integer, String)

lookupTable.Add(1, "One")

lookupTable.Add(2, "Two")

lookupTable.Add(3, "Three")

lookupTable.Add(4, "Four")

Компилятор вызывает метод Add с двумя параметрами, а не с одним. Он распознает, что делать нужно именно так, поскольку значения, переданные инициализатору набора, были заключены во вложенные скобки наподобие {{1, “One”}, {2, “Two”}, …}. Для каждого набора вложенных скобок компилятор пытается передать соответствующие параметры в совместимый метод Add.

Вы также можете предоставить собственную реализацию Add, используя метод расширения:

<Extension()>

Sub Add(ByVal source As IList(Of Customer),

ByVal id As Integer,

ByVal name As String,

ByVal city As String)

 

source.Add(New Customer With

{

.ID = id,

.Name = name,

.City = city

})

End Sub

(И вновь обратите внимание на отсутствие так надоедавших ранее знаков подчеркивания!) Этот метод расширяет любой тип, реализующий IList(Of Customer), а затем позволяет использовать новый синтаксис инициализатора набора:

Dim list = New List(Of Customer) From

{

{1, "Jon", "Redmond"},

{2, "Bob", "Seattle"},

{3, "Sally", "Toronto"}

}

Это приводит к добавлению к списку трех клиентов. Инициализаторы наборов можно использовать в сочетании с автоматически реализуемыми свойствами:

Property States As New List(Of String) From {"AL", "AK", "AR", "AZ", ...}


<== previous lecture | next lecture ==>
Автоматически реализуемые свойства | Литералы массивов
lektsiopedia.org - 2013 год. | Page generation: 0.128 s.