Inferred Typing был включен в язык (C# и VB) в последних двух версиях языка, чтобы поддерживать anonymous typing через Linq. Это отличается от старого типа VB-dim
, который создал тип Variant
.
Анонимный тип - это сокращенный способ выбора только определенных предметов из объекта внутри коллекции. Например, рассмотрим ниже:
dim users as new List<User>()
'...Code that adds users to the List here.
dim usernames = From U in users
Select new with { .Username = U.Username }
Это занимает список пользователей, и создает новый перечислимых с объектами, которые содержат только имя пользователя. Это особенно полезно, поскольку оно также может использоваться для объединения списков.
Кроме того, некоторые люди выступают за его использование, когда кто-то читает код, чтобы знать код , что объект (т. Е. Какой конкретный класс он есть), а просто то, что он представляет. Jon Skeets Ответ дает достойное освещение этого типа мышления. На самом деле это не то, для чего был разработан Implicit Typing, но, как всегда, разработчики находят применение для вещей, которые дизайнеры никогда не рассматривали.
Стоит отметить, что Inferred Typing (и анонимная типизация) является чисто тщеславием Design-Time. Под капотом во время компиляции компилятор фактически создаст конкретный класс, представляющий анонимный тип, и закодирует переменную на жесткий код.Вы можете подтвердить это, смотря на выходе IL для еха:
Sub Main()
Dim x = 5
Dim y As Integer = 9
End Sub
выходов к IL, как
.locals init ([0] int32 x,
[1] int32 y)
Вы можете видеть, что он инициализирован их Ints. Точно так же, используя анонимный тип:
Sub Main()
Dim data As New List(Of Integer)({1, 2, 3, 4, 5})
Dim y = From D In data
Select New With {.Val = D, .Calc = D/100}
End Sub
вызывает компилятор, чтобы создать новый тип внутри EXE-файла:
, и код, чтобы использовать этот тип:
.locals init ([0] class [mscorlib]System.Collections.Generic.List`1<int32> data,
[1] class [mscorlib]System.Collections.Generic.IEnumerable`1<class VB$AnonymousType_0`2<int32,float64>> y,
[2] int32[] VB$LW$t_array$S0)
Это это «вывод типа». У компилятора достаточно информации для определения типа. –
Хорошо, спасибо Джон, но какая реальная выгода здесь, по вопросу? Только меньше кода? – EvilDr
Операция as хороша, когда вы собираетесь инициализировать переменную post-declaration. Если вы собираетесь инициализировать эту переменную сразу, однако указание типа кажется ненужным, если компилятор просто собирается вывести тип в любом случае. – RageCage