我是否必须在c#中“双重声明”每个新实例?
Obj sb = new Obj();
VB更便宜
Dim sb as new Obj()
和Python最便宜
sb=Obj()
答案 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表达式)。所以不,你不必再指定它两次了。事实上,目前很少见到这种明确且可能冗余的规范(例如,初始变量声明)的要求