【问题标题】:Declaring variables in VB without AS在没有 AS 的 VB 中声明变量
【发布时间】:2014-08-29 07:36:53
【问题描述】:

我刚刚查看了 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")

【问题讨论】:

  • 这是“类型推断”。编译器有足够的信息来判断类型。
  • 好的,谢谢约翰,但是根据问题,这里的实际好处是什么?只是更少的代码?
  • as 语句在您要初始化变量后声明时很好。但是,如果您要立即初始化变量,那么如果编译器无论如何都只是要推断类型,那么指定类型似乎是不必要的。
  • @EvilDr - 如果您想使用类型推断并且仍然让编译器为您“检查”,请查看Option Infer On(或关闭)语句以及Option Explicit

标签: asp.net vb.net


【解决方案1】:

Inferred Typing 是在该语言的最后几个版本中引入该语言(C# 和 VB)的一个功能,以便通过 Linq 支持 anonymous typing。这与创建 Variant 类型的旧 VB 类型 dim-ing 不同。

匿名类型是一种仅从集合中的对象中挑选某些项目的简写方式。例如,考虑以下内容:

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 的回答很好地涵盖了这种类型的思维。这并不是隐式类型的真正设计目的,但与往常一样,开发人员会发现设计人员从未考虑过的东西的用途。

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

【讨论】:

  • 带回语言 - 这意味着该功能之前存在,然后被删除,然后带回。您是在暗示过去或以前版本的 VB 或 C# 中存在类型推断吗?
  • 啊,不,我的意思是语法 - 旧的 VB 允许您在没有类型的情况下进行调暗,并且基本上将其创建为 Variant(我相信)。我会更新答案以消除歧义
【解决方案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};

编译器知道新类型。现在您不必更改类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多