我刚刚在VS2013中查看模板以获取新的WebForms应用程序。当我使用模板创建一个新站点时,有很多代码如下:
Dim requestCookie = Request.Cookies("SomeCookie")
将鼠标悬停在requestCookie
变量名称上,VS声明它确实是HttpCookie
对象类型:
自从VB6(ASP经典版)以来,我还没有看到像这样的变量。我在C#模板中看到使用了相同的方法。我也看到人们在编写C#代码时经常使用它。
这是一种新方法还是有效的'一直以来?除了更少的代码之外,它有什么好处吗?
我个人认为这会使代码更难解密,更喜欢明确设置类型:
所有MSDN documentation regarding Dim节目都显示As
。
Dim requestCookie As HttpCookie = Request.Cookies("SomeCookie")
答案 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
使用此类型的代码:
.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)