在没有AS的情况下在VB中声明变量

时间:2014-07-08 14:09:14

标签: asp.net vb.net

我刚刚在VS2013中查看模板以获取新的WebForms应用程序。当我使用模板创建一个新站点时,有很多代码如下:

Dim requestCookie = Request.Cookies("SomeCookie")

将鼠标悬停在requestCookie变量名称上,VS声明它确实是HttpCookie对象类型:

VS identifies object type

自从VB6(ASP经典版)以来,我还没有看到像这样的变量。我在C#模板中看到使用了相同的方法。我也看到人们在编写C#代码时经常使用它。

这是一种新方法还是有效的'一直以来?除了更少的代码之外,它有什么好处吗?

我个人认为这会使代码更难解密,更喜欢明确设置类型: 所有MSDN documentation regarding Dim节目都显示As

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

Inferred Typing是该语言最后几个版本中引入语言(C#和VB)的功能,以便通过Linq支持anonymous typing。这与创建dim类型的旧VB类型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 }

这将获取用户列表,并使用仅包含用户名的对象创建新的Enumerable。它特别有用,因为它也可用于合并列表。

此外,有些人提倡使用它,因为对于阅读代码的人而言,知道对象是什么<(即具体类是什么)并不重要,而只是它代表什么。 Jon Skeets回答可以很好地报道这种思维方式。 Implicit Typing的设计并不是真的,但是一如既往,开发人员会找到设计师从未考虑过的东西。

值得注意的是,推断打字(和匿名打字)纯粹是一种设计时的自负。在引擎盖下,在编译期间,编译器实际上将创建一个表示匿名类型的具体类,并将该变量编码为硬编码类型。您可以通过查看exe的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:

中创建一个新的Type

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)