【问题标题】:Is using the keyword var bad in C# 2.0?在 C# 2.0 中使用关键字 var bad 吗?
【发布时间】:2010-04-29 10:15:17
【问题描述】:

我阅读了一篇关于 using C# 3 features in C# 2 的文章,例如,您可以在其中键入 var x = 2;,即使项目是 2.0 项目,Visual Studio 2008 编译器也会选择它并生成与键入 @ 时相同的代码987654323@.

但我不明白的是,在某些情况下你应该这样做吗?我一直认为 var 关键字直到 C# 3 才出现。如果编译器生成相同的代码并且我可以键入 C# 3 代码和 C# 2 代码完全相同,那么真正的区别是什么,因为 CLI 是一样吧?

引用上面的链接

在后台,编译器生成常规 .NET 2.0 代码。

.NET 2.0 代码和 .NET 3 代码有什么区别吗?

【问题讨论】:

  • 您混淆了 C# 和 .Net Framework 版本。 “在 C# 2 中使用 C# 3 功能”- 是错误的说法。应该是“在 .Net 2.0 中使用 C# 3 功能”。

标签: c# .net compiler-construction


【解决方案1】:

恐怕你混淆了 C# 版本和 .NET 版本。

你不能在 C# 2.0 中使用var,编译器会认为它只是一个标识符。但是您可以在面向 .NET 2.0 的 C# 3.0 中使用它,因为 var 只是一种语言 (C#) 构造,而不是 .NET 构造。 .NET 编译器会将其转换为生成的 CIL 中的适当类型,因此 JIT 编译器永远不会看到它,您将完全没问题。

由于 VS2008 编译器是 C# 3.0 编译器,因此无论您的目标是什么 .NET 版本,您都可以在那里使用 var

【讨论】:

  • 啊哈!这就是我一直在寻找的答案。这可能是另一个问题,但在这种情况下,.NET 2 和 .NET 3 之间的结果代码之间是否有任何区别,即编译器完成它之后的结果?
  • CIL 与您在赋值中编写右侧表达式返回的类型完全相同;您的目标是哪个 .NET 版本并不重要。
  • 所以 .NET 2 和 .NET 3 之间的区别在于 .NET 3 包含一些额外的类(如 LINQ),并且语法实际上是相同的(如果您使用 C# 3 编译器,例如VS2008)?
  • 语法属于语言(在本例中为 C#),而不是框架 (.NET)。有一些语言特性需要特定的框架能力(例如泛型),但其他的则不需要。例如,您可以在 .NET 2.0 中使用扩展方法,因为 C# 编译器会将它们转换为普通的静态函数调用;现在,当然,不要指望 .NET 泛型方法出现在您的 .NET 2.0 库中,但您可以定义自己的。
【解决方案2】:

var 是 VS2008 使用的 C#3 语言中的语法糖。该代码仍然可以编译为与 .net 2.0 兼容。您应该遇到的唯一问题是您是否需要在 VS2005 中编辑这些文件。

【讨论】:

  • 当然它是 C# 3 的一部分。它不是 .NET 3.5 的一部分,但那是另一回事。
  • 啊,我明白了。这就说得通了。所以我仍然可以用我的 VS 2008 定位到 .NET 2 并让 VS 2005 用户使用我的 dll。这其实很漂亮
  • 这绝对是错误的。 var 关键字是 C# 的一项功能,它使用类型推断 - 特别是当您使用匿名类型(如 LINQ 查询)时。这不是 IDE 的诡计。
【解决方案3】:

关于它的用法。

在执行方面还不错,如前所述,它只是语法糖,在编译时被替换。

在编码时,我认为它的用途是混合的。例如:

我觉得还可以。很容易看出价值是什么

var a = "test"; 

不太好,很多人必须在 IDE 中滚动才能真正理解代码,这很痛苦。

var b = SomeReallyLongNameSpace.SubNamespace.Namespace.Class.Enum.Value1; 

这很好,你知道结果是什么,因为一个明确定义的方法。

var c = GetString(); 

你一目了然不知道返回了什么,这没有帮助,最好定义而不是使用 var 关键字。

var d = GetSomething(); 

【讨论】:

  • 我同意。这都是关于可读性的。如果您分配给 var 的类型很明显,请使用 var。如果不明显,请使用类型的名称。当然,对于匿名类型,你别无选择,只能使用var
  • 是的,好吧。这不是我真正问的。关于关键字 var 有很多问题。我想知道为什么我能够在我的 Visual Studio 2008 IDE 中输入它,即使我的项目是针对 .NET 2 的。感谢您的回答
  • @Patrick,我只是略过了这个问题......标题是“在 C# 2.0 中使用关键字 var bad 吗?”并在其中包含你问“但我不明白的是,在某些情况下你不应该这样做吗?”。我试图强调一些你不应该不管构建过程的情况。
  • 啊,这是一个公平的解释。也许我应该以不同的方式表达自己。我的意思是,如果我使用var,它会在某个地方损坏,因此不应该使用。
  • 3 年后,但是:如果你改用 var something = GetSomething();,变量名 something 就不需要 Something something = GetSomething();。是变量名d的使用使代码难以理解,而不是var的使用。
【解决方案4】:

关于 var:它是纯语法糖和编译器技巧。键入 var 您要求编译器根据表达式的右侧猜测类型。这可以很容易地编译到 .net 2.0。 Linq 可能无法工作,因为它使用 .net 3.5 的程序集

【讨论】:

  • LINQ 的工作方式是编译器会将查询表达式转换为对 Where、SelectMany 等的调用。如果找不到任何此类方法,它将无法编译(通常确实会发生这种情况,因为 System.Linq.Enumerable 在 .NET 2.0 中不存在),但如果您提供自己的 Where、SelectMany 等方法,它应该绑定到它们并工作。
【解决方案5】:

在 C# 3.0 中引入了 var 来保存匿名类型的实例。

在 .net2.0 中可能是 VS2008 或 C# 编译器必须将其替换为在设计时已经知道的实际类型,如果您在编码时已经知道类型,为什么要使用 var! :)

【讨论】:

  • var 并不暗示匿名类型,它只是启用它。例如。 var x = 1;,x 将是 int,而不是匿名类型。
  • 同意 - var 可以代表任何类型。你不会将它用于在编码时已经知道的类型,你宁愿将它用于匿名类型!
  • @this。 __curious_geek,这取决于您自己的喜好。我在任何地方都使用 var 并且我永远不会明确地编写正确的类型。如果你使用 var 会更灵活,并且它使重构更容易一些,而且它没有任何缺点。
  • 我从未说过这样做有任何缺点,但尝试在 VS2008 IDE 文本编辑器之外使用这种方法进行编码。您将在代码中看到的所有内容都是 var var var!
  • @this。 __curious_geek,您似乎说的是您不会将 var 用于已知类型。我要说的是我一直都这样做,这很常见。反正我不管它是什么类型。而且我不使用任何没有智能感知的 IDE。
猜你喜欢
  • 2013-09-04
  • 2013-04-19
  • 2011-04-03
  • 2010-11-15
  • 2011-04-03
  • 2015-04-02
  • 2012-05-19
  • 2010-09-28
  • 2010-11-11
相关资源
最近更新 更多