C# 为什么c“需要”;var";标识符?

C# 为什么c“需要”;var";标识符?,c#,scala,syntax,C#,Scala,Syntax,可能重复: 为什么c#需要类型推断类型变量的“var”标识符 我的意思是,不谈它有什么问题: a = 1; //vs var a = 1; 阅读Scala中的编程: “Type variable”语法您不能简单地取消类型-将不再有开始定义的标记 但是在a:Int或Int a中省略它有什么不同呢?至少想到一个原因是,它迫使程序员声明他们引入新变量的意图,而不是分配给现有变量。这使编译器能够检测许多常见的编码错误。从技术上讲,确实没有必要。其他语言允许您在没有特殊关键字的情况下组合声明和赋值 如

可能重复:

为什么c#需要类型推断类型变量的“var”标识符

我的意思是,不谈它有什么问题:

a = 1;
//vs
var a = 1;
阅读Scala中的编程:

“Type variable”语法您不能简单地取消类型-将不再有开始定义的标记


但是在a:IntInt a中省略它有什么不同呢?

至少想到一个原因是,它迫使程序员声明他们引入新变量的意图,而不是分配给现有变量。这使编译器能够检测许多常见的编码错误。

从技术上讲,确实没有必要。其他语言允许您在没有特殊关键字的情况下组合声明和赋值


如果
a=1
是赋值和声明的有效语法,那么代码可能会变得非常混乱,这就是为什么C#至少需要
var

在C#中使用之前必须定义变量的原因。当然,编译器可以检测它何时到达

a = 1;
a尚未定义,因此定义变量并将其赋值为1。但是,这可能会导致其他问题:

MyOwnClass myVeryLongVariableNameThatIsUsedAllOverThePlace = new MyOwnClass();
myveryLongVariableNameThatIsUsedAllOverThePlace = input.GetNewClass();

现在您有了两个变量,您以为只有一个。

关键字将告诉编译器不要尝试在方法范围之外解析
标识符

没有它C#能工作吗?是的,但这强制执行了强类型语言所需的规程。

来自MSDN:

重要的是要了解 var关键字并不表示“variant” 并不表示 变量是松散类型的,或者 晚班。这只是意味着 编译器确定并分配 最合适的类型

我们的想法是通过防止意外事故来保持C的健壮性。

考虑以下几点:

class Foo
{
    int a;

    void Bar()
    {
        var a = 1;
    }
}
如果没有
var
关键字,则分配给类成员
a


var
明确引入了一个新的局部变量。

不同的编程语言设计用于不同的目的。C#是为编写大规模高可靠性软件而设计的。其方法的一部分是使用显式声明的静态类型变量。通过添加匿名对象(LINQ查询表达式需要匿名对象),可以推断变量类型。这些东西的存在并没有改变这样一个事实,即必须明确声明变量,并在编译时建立它们的类型(当然是modulo
dynamic


显式变量声明消除了用不需要变量声明的语言编写的程序中有时会出现的一大类错误。

在我的拙见中,我认为可以安全地假设它们没有(或不能)显著修改C#语法,从而允许省略(类型或“var”)将类型推断添加到语言时,变量声明中的标记。(这也会对函数声明产生影响。)

我认为这样的改变会对整个语法产生连锁反应,破坏向后兼容性


也许F#是语法在这样一个基本层面上发生变化的副产品;)

啊!!我怎么会错过呢。但是在scala中不是同样的情况吗?scala不允许您不使用val/var就离开。。。我想知道:Int符号的优点是什么——我的意思是它似乎只添加了“var/val”——而不是将它们去掉@drozzy:我不知道Scala,但我猜在某些上下文中,所需的变量类型要么无法从初始化表达式中推导,要么推导错误。作为参数,您不需要var/val.def foo(x:Int)。在cases和lambdas中声明的变量也是如此,但在scala中也是如此。