2014-07-08 4 views
0

Я только что просмотрел шаблоны в VS2013 для нового приложения WebForms. При создании нового сайта с помощью шаблона, есть много кода, как это:Объявление переменных в VB без AS

Dim requestCookie = Request.Cookies("SomeCookie") 

Парящих над именем переменного requestCookie, В. С. утверждает, что это действительно тип HttpCookie объекта:

VS identifies object type

Я не видел переменные, объявленные так же, как VB6 (ASP classic). Я вижу в шаблонах C# тот же подход. Также я вижу, что люди много используют его при написании кода на C#.

Это новый подход или он был «действительным» все это время? Есть ли какая-то польза для него, кроме как меньше кода?

Я лично думаю, что он делает код сложнее расшифровать и предпочитает явно задавать тип: Все MSDN documentation regarding Dim показывает As Используется.

Dim requestCookie As HttpCookie = Request.Cookies("SomeCookie") 
+2

Это это «вывод типа». У компилятора достаточно информации для определения типа. –

+0

Хорошо, спасибо Джон, но какая реальная выгода здесь, по вопросу? Только меньше кода? – EvilDr

+1

Операция as хороша, когда вы собираетесь инициализировать переменную post-declaration. Если вы собираетесь инициализировать эту переменную сразу, однако указание типа кажется ненужным, если компилятор просто собирается вывести тип в любом случае. – RageCage

ответ

2

Это «тип вывода». У компилятора достаточно информации для определения типа.

К сожалению у меня нет примера VB.NET под рукой:

var data = from c in context.Customers 
      select new {c.Name, c.Address}; 

Что тип data? Компилятор знает. Что делать, если вы измените выражение?

var data = from c in context.Customers 
      select new {c.Name, c.Address, c.Phone}; 

Компилятор знает новый тип. Теперь вам не нужно менять тип.

1

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-файла:

IL With Anonymous Type

, и код, чтобы использовать этот тип:

.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) 
+0

_ возвратился в язык_ - это означает, что функция существовала до и затем была удалена, а затем _brought back_. Вы предполагаете, что вывод типа существовал в прошлом или в предыдущих версиях VB или C#? –

+0

А нет, я имел в виду синтаксис - Older VB позволил вам сгладить без типа и по существу создать его как «Вариант» (я считаю). Я обновлю ответ, чтобы устранить двусмысленность –

Смежные вопросы