为什么声明是必要的

Pau*_*cer 13 .net c# variables clr declaration

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

我们为什么要申报?

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

Animal animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

var animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

可能成为

animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pat*_*man 25

当然,这是可能的.

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

  1. 变量的范围是多少?如果你不告诉编译器,不清楚.会animals在两个方法中成为私有变量还是两个方法作用域变量?
  2. 如果名字是拼写错误怎么办?你永远不会知道.
  3. 如果你已经分配一个值,这个变量,然后尝试分配一个新的值,它是与上次不兼容(即JavaScript的方式)(学分马里奥·斯托伊洛夫)


Mat*_*son 13

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

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

myString = "New value";
Run Code Online (Sandbox Code Playgroud)

但你不小心输入了这个:

myStrimg = "New value";
Run Code Online (Sandbox Code Playgroud)

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


Nee*_*eel 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的广泛使用的论点(以及它的保留,正确使用):

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

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

 // 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);
Run Code Online (Sandbox Code Playgroud)

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

   // a more descriptive declaration   
   DataTable individuals = GetContacts(ContactTypes.Individuals) 
Run Code Online (Sandbox Code Playgroud)

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

额外注意事项: -

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

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

 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++)
Run Code Online (Sandbox Code Playgroud)
  • 坏:

       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
    
    Run Code Online (Sandbox Code Playgroud)