2010-09-26 87 views
0

我需要在c#中“双重声明”每个新实例吗?在C#中声明实例

Obj sb = new Obj(); 

VB便宜

Dim sb as new Obj() 

和Python最低

sb=Obj() 

回答

6

好,为C#3你可以使用var局部变量:

var x = new Dictionary<string, string>(); 

注意这个我与Python声明非常不同:变量x仍然是Dictionary<string, string>类型;只是编译器从作业的右侧推断了类型。所以你仍然可以获得IntelliSense支持以及静态类型的所有其他好处。 (如果你想动态输入,你可以使用C#4以来的dynamic,但这是一个非常不同的功能。)

此功能部分添加以支持匿名类型,尽管它在其他情况下也非常有用;最值得注意的是当你调用一个构造函数。

有几件事情要牢记:

  • 适用于局部变量,而不是实例或静态变量
  • 您只能使用它,当你声明,并在相同的分配声明
  • 编译器必须能够从作业中推断具体类型;你不能写

    var x = null; 
    

    例如。

  • 牢记可读性。如果不是很明显是被分配什么样的类型,可以考虑使用一个明确的声明
  • 如果以后要分配了一个不太确切的表达,你可能需要使用显式类型
  • 隐式类型有助于强调什么代码是这样做的而不是它如何它是这样做的;对于其中“how”特别重要的代码位,考虑仍然使用显式声明
+0

啊,太好了。 *请记住检查解决方案,由于某些原因,必须等待13分钟。* – joeriks 2010-09-26 08:40:55

+0

@joeriks:“某种原因”是在那个时候可能会有更好的答案。当然,更好的答案可能会在以后出现,但它让所有人都有机会进入,而问题仍然比较新鲜。 – 2010-09-26 08:43:34

+0

@joeriks,你是否以任何方式测试答案的证明?我并不怀疑乔恩的答案,但立即接受任何听起来不错的(精心制作的)答案都不会帮助任何人;)尤其是当答案完全错误时。所以要小心太快(没有冒犯性) – 2010-09-26 08:51:10

3

在C#3.0和更高版本中,您现在可以使用var声明它们。

var obj = new Obj(); 
+0

非常感谢,我责备在移动设备上打字;) – 2010-09-26 09:28:16

0

以下示例显示了一些类型推论没有双重明确的类型规范(有时不存在)发生如下:

int[] array = { 1, 2, 3, 5, 6, 7, 8 }; 


    var q = from x in array 
      let y = x.ToString() 
      select y; 

    foreach (var item in q) 
    { 

     Console.WriteLine(item.GetType()); 

    } 

1)阵列decalration的右手侧单独示出了数组初始化没有类型说明。过去需要使用数组类型规范。
2)var q ....其中q从右侧推断。
3)从x ....这个范围变量的类型是从数组的元素类型推断的
4)让y ...从右边再次推断范围变量y的类型 5)foreach(var中的项目)...再次推断的项目类型并未明确声明

在规范中详述的现代C#版本(例如lamba表达式)中有无数类型推断的其他实例。所以不,你不必再指定两次。事实上,目前很难看到这种明确的和潜在的冗余规范的要求(例如,变量声明)