在C#中声明实例

时间:2010-09-26 08:38:59

标签: c# syntax

我是否必须在c#中“双重声明”每个新实例?

Obj sb = new Obj(); 

VB更便宜

Dim sb as new Obj() 

和Python最便宜

sb=Obj()

3 个答案:

答案 0 :(得分:6)

好吧,从C#3开始,您可以将var用于本地变量:

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

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

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

要记住的一些事情:

  • 适用于局部变量,而非实例或静态变量
  • 您只能在声明和分配相同声明时使用它
  • 编译器必须能够从赋值中推断出具体类型;你不能写

    var x = null;
    

    例如。

  • 牢记可读性。如果分配的是哪种类型并不明显,请考虑使用明确的声明
  • 如果您以后想要指定一个不太具体的表达式,则可能需要使用显式输入
  • 隐式输入有助于强调代码正在做什么而不是 它正在做什么;对于“如何”特别重要的代码位,请考虑仍使用显式声明

答案 1 :(得分:3)

在C#3.0及更高版本中,您现在可以使用var。

声明它们
var obj = new Obj();

答案 2 :(得分: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(q中的var项)...再次推断并且未明确声明的项的类型

现代版本的C#中有无数类型推断的实例,详见规范(例如lamba表达式)。所以不,你不必再指定它两次了。事实上,目前很少见到这种明确且可能冗余的规范(例如,初始变量声明)的要求