![]() |
Инициализаторы набора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. Вы можете использовать инициализаторы набора применительно к любому типу, который отвечает следующим требованиям:
Это означает, что вы можете использовать инициализаторы набора и с более сложными типами, такими как словари: 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", ...}
|