为什么声明是必要的

我目前正在教同事.Net,他问我一个困扰我的问题。

我们为什么要申报?

如果var是隐式输入,为什么我们甚至要声明?

Animal animal = new Animal(); 

 var animal = new Animal(); 

可能成为

 animal = new Animal(); 

隐式类型仍然意味着这是一个静态类型变量。

如果为变量分配了两种不同的类型,如果它们不共享基类(除了对象),则可能是编译器错误。

是否有技术原因无法完成或风格上我们喜欢有没有

当然,这是可能的。

我可以想到你不想要的几个原因:

  1. 变量的范围是多少? 不清楚你是否告诉编译器。 两种方法中的animals会变成私有变量还是两个方法范围变量?
  2. 如果名字是拼写错误怎么办? 你永远不会知道。
  3. 如果您已经为此变量赋值,然后尝试分配与上一个不兼容的新值(即javascript样式)( Mario Stoilov的信用),该怎么办?

一个非常重要的原因是它有助于防止因意外错误输入变量名称而导致的错误。

想象一下,你想重新分配字符串myString以获得一个新值:

 myString = "New value"; 

但你不小心输入了这个:

 myStrimg = "New value"; 

这将导致编译时错误。 但是,如果你根据你的问题允许隐式创建的变量,这将默默地创建一个新变量,具有可预测的热闹结果……

正如Brad Smith所建议的http://www.brad-smith.info/blog/archives/336 : –

一些程序员似乎倾向于为每个变量声明使用var。 当然,语言不会阻止你这样做,事实上,MSDN承认这是一种“语法上的便利”……但它也强烈警告:

使用var确实至少有可能使您的代码更难以理解为其他开发人员。 因此,C#文档通常仅在需要时才使用var。

隐式类型局部变量(C#编程指南),MSDN

我最近发现,常用的工具ReSharper实际上要求自由使用var。 坦率地说,这对情况没有帮助。 有些开发人员试图certificatevar在某种程度上提高了可读性和更广泛的编码实践,例如本文:

通过使用var,您强迫自己更多地考虑如何命名方法和变量,而不是依赖于类型系统来提高可读性,这更像是一个实现细节……

var提高了可读性,Hadi Hariri

我同意上面引用的前提,但不同意最终结果。 相反,var的过度使用和误用会导致一些非常糟糕的习惯……

让我们看一下反对var的广泛使用的论点(以及它的保留,正确使用):

隐式类型变量会失去描述性

类型名称在局部变量声明中提供了额外的描述层:

  // let's say we have a static method called GetContacts() // that returns System.Data.DataTable var individuals = GetContacts(ContactTypes.Individuals); // how is it clear to the reader that I can do this? return individuals.Compute("MAX(Age)", String.Empty); 

我上面的变量名称是完全描述性的; 它区分使用GetContacts()填充的任何其他变量以及DataTable类型的其他变量。 当我对变量进行操作时,我知道这是我所指的个别联系人,而且我从他们那里得到的任何东西都属于这种情境。 但是,如果没有在声明中指定类型名称,我将失去它提供的描述性…

  // a more descriptive declaration DataTable individuals = GetContacts(ContactTypes.Individuals) 

当我重新审视这段代码时,我不仅知道变量在概念上代表什么,而且还知道它在结构和用法方面的代表性; 上一个例子中缺少的东西。

额外注意事项: –

以下是一些基于合理使用隐式变量声明的好/坏示例…

  • 好:

      var numbers = new int[] {1, 2, 3, 4}; var stringbuilder = new StringBuilder(); var cars = new List(); var orders = new Dictionary(); 

+/-可以使用(但更喜欢显式声明):

  int pages = 10; string username = “john”; var username = “john”; var order = GetOrder(orderId); // ok if the type is Order, otherwise not for (var x = 1; x < 10; x++) 
  • 坏:

      var settings = GetInboxSettings(); // not obvious at all var userId = GetUserId(); // ambigous, is this guid, string, int or a custom UserId object? Dictionary orders = new Dictionary(); // redundant 

当我们声明变量xxx ,我们在工具中指出以下内容

  • 为对象腾出空间
  • 将生活在这个范围内
  • 并且属于这种类型(可选)

我们对人类所说的是

  • 此范围内存在名为xxx的对象
  • 这种类型(可选)

范围对于这两个方面都是必不可少的,因为工具需要知道变量将存在多长时间,并且人类需要查看变量所在的位置。 类型可以是一个很好的信息,但许多语言没有它,所以我认为它不重要,但YMMV

编译器可以确定变量的范围是什么,例如通过确定变量名称的第一次遇到是变量的声明,以及下面具有相同名称的任何单词是对该变量的引用。 另一方面,人类无法成功地追踪这种复杂性。

所以我要说我们有一个很好的理由来声明变量:告诉人们阅读我们的代码它存在 。 声明变量可提高其可见性并澄清对我们理解程序至关重要的信息。

必须有很多原因。 我能想到的一个原因是属性/字段引用与新变量之间的模糊性。

但是,可能C#编译器团队仍然可以开发这样的function。 但使用var简化了一切。 我们节省了设计工作,开发工作,测试工作和维护工作。 最重要的是,它使您的代码更具可读性

好吧,我不是在争论一些答案中提到的事实。 相反,我想以不同的方式回答:

 int count; if(someConditionIsTrue) count = 3; else count = 1; 

我不能在这里使用“var count”。 我可以吗? 现在,以下两行中哪一行看起来很漂亮:

 Tuple tuple = new Tuple(1, "p", true, 3.0f); 

要么

 var tuple = new Tuple(1, "p", true, 3.0f);