为什么声明是必要的

时间:2014-05-13 08:25:22

标签: c# .net variables clr declaration

我目前正在教同事.Net,他问我一个难以理解的问题。

为什么我们必须申报?

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

Animal animal = new Animal();

变为

var animal = new Animal();

可能会成为

animal = new Animal();

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

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

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

6 个答案:

答案 0 :(得分:25)

当然, 是可能的。

我可以想到一些你不想要的理由:

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

答案 1 :(得分:13)

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

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

myString = "New value";

但你不小心输入了这个:

myStrimg = "New value";

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

答案 2 :(得分:11)

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

  
    

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

         

使用var确实至少有可能使你的代码更多     其他开发人员难以理解。出于这个原因,C#     文档通常仅在需要时才使用var。

         

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

         

我最近发现了常用的ReSharper工具     实际上要求自由使用var。坦率地说,这没有帮助     情况。有些开发商试图争论立场     var以某种方式提高了可读性和更广泛的编码实践,     比如这篇文章:

         

通过使用var,你迫使自己更多地考虑你的方式     命名方法和变量,而不是依赖于类型系统     提高可读性,更多的是实现细节......

         

var提高了可读性,Hadi Hariri

         

我同意上面引用的前提,但不是最后的结论     结果。相反,var的过度使用和误用会导致     一些非常坏的习惯...

         

让我们来看看反对广泛使用var的论点(和for     它的节约,正确使用):

         

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

  
     

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

 // 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
    

答案 3 :(得分:2)

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

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

我们对人类所说的是

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

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

嗯,我不会在一些答案中质疑这里提到的事实。相反,我想以不同的方式回答:

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

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

Tuple<int, string, bool, float> tuple = new Tuple<int, string, bool, float>(1, "p", true, 3.0f);

OR

var tuple = new Tuple<int, string, bool, float>(1, "p", true, 3.0f);