为什么c#需要类型推断类型变量的“var”标识符?
我的意思是把它关掉是什么问题:
a = 1;
//vs
var a = 1;
阅读Scala中的编程:
“类型变量”语法你不能简单地省去类型 - 再也没有标记来启动定义了。
但是在 a:Int 或 int a 中将它留下来会有什么不同?
答案 0 :(得分:16)
至少有一个原因是它强迫程序员声明引入新变量的意图,而不是分配给现有变量。这使编译器能够检测到许多常见的编码错误。
答案 1 :(得分:2)
考虑一下:
class Foo
{
int a;
void Bar()
{
var a = 1;
}
}
如果没有var
关键字,则分配将是类成员 a
。
var
毫不含糊地引入了一个新的局部变量。
答案 2 :(得分:1)
在C#中使用之前,必须先定义一个变量。当然,编译器可以检测到它何时到达
a = 1;
尚未定义a,因此定义变量并为其赋值1.但是,它可能导致您遇到的其他问题:
MyOwnClass myVeryLongVariableNameThatIsUsedAllOverThePlace = new MyOwnClass();
myveryLongVariableNameThatIsUsedAllOverThePlace = input.GetNewClass();
现在你有两个变量,你认为你有一个。
答案 3 :(得分:1)
来自MSDN:
了解这一点非常重要 var关键字不代表“变种” 并没有表明 变量是松散类型,或 后期绑定。它只是意味着 编译器确定并分配 最合适的类型。
我们的想法是通过防止意外Implicitly Typed Local Variable来保持C#的健壮性。
答案 4 :(得分:0)
从技术上讲,确实没有必要。其他语言允许您将声明和赋值组合在一起,而不使用特殊关键字。
如果a = 1
是赋值和声明的有效语法,代码可能会变得非常混乱,我相信,为什么C#至少需要var
。
答案 5 :(得分:0)
关键字会告诉编译器不尝试解析方法范围之外的identifier
。
C#可以在没有它的情况下工作吗?是的,但是这会强制执行强类型语言所需的纪律。
答案 6 :(得分:0)
不同的编程语言旨在满足不同的目的。 C#专为编写大规模高可靠性软件而设计。它的部分方法是使用显式声明的静态类型变量。添加匿名对象需要能够推断变量类型,这是LINQ查询表达式所必需的。这些东西的存在并没有改变变量必须明确声明并且它们的类型在编译时建立的事实(当然是模dynamic
)。
显式变量声明删除了一大类错误,这些错误有时会出现在用不需要变量声明的语言编写的程序中。
答案 7 :(得分:0)
在我看来,我认为可以安全地假设他们没有(或不能)修改C#语法,以至于允许在变量中省略(类型或“var”)标记声明时,他们为语言添加了类型推断。 (这也会对函数声明产生影响。)
我认为这样的改变会对整个语法产生连锁反应并破坏向后兼容性。
也许F#是语法在这样一个基础层面上被改变的副产品;)