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