【问题标题】:Why does c# need "var" identifier? [duplicate]为什么 c# 需要“var”标识符? [复制]
【发布时间】:2011-08-09 11:52:49
【问题描述】:

可能重复:
What's the point of the var keyword?

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

我的意思是把它关掉有什么问题:

a = 1;
//vs
var a = 1;

阅读 Scala 编程:

“类型变量”语法你不能简单地省略类型 - 将不再有开始定义的标记。

但是在 a:Intint a 中保留它有什么不同呢?

【问题讨论】:

    标签: c# scala syntax


    【解决方案1】:

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

    【讨论】:

    • 啊!我怎么错过了。但在 scala 中不也是如此吗?
    • Scala 不会让你在不使用 val/var 的情况下逃脱。
    • 那是真的...我想知道a:Int 表示法的优点是什么——我的意思是它似乎只添加了“var/val”——而不是把它们拿走!
    • @drozzy:我不了解 Scala,但我猜测在某些情况下,变量的所需类型要么无法从初始化表达式中推导出来,要么推导不正确。
    • 作为参数你不需要var/val。 def foo(x: Int)。在 case 和 lambdas 中声明的变量也是如此。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      a = 1;
      

      a 尚未定义,因此定义变量并将其赋值为 1。但是,它可能会导致您遇到的其他问题:

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

      现在你有 2 个变量,你以为你有一个。

      【讨论】:

        【解决方案4】:

        关键字将告诉编译器尝试解析identifier 在方法范围之外

        没有它,C# 可以工作吗?是的,但这会强制实施强类型语言所必需的规范

        【讨论】:

          【解决方案5】:

          来自 MSDN:

          理解这一点很重要 var 关键字并不意味着“变体” 并且并不表示 变量是松散类型的,或者 迟到。这只是意味着 编译器确定并分配 最合适的类型。

          这个想法是通过防止意外Implicitly Typed Local Variable 来保持 C# 的稳健性。

          【讨论】:

            【解决方案6】:

            考虑一下:

            class Foo
            {
                int a;
            
                void Bar()
                {
                    var a = 1;
                }
            }
            

            如果没有var 关键字,则分配给类成员 a

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

            【讨论】:

            • 但在 scala 中也是如此。
            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-10-16
                • 1970-01-01
                • 2015-12-19
                • 2011-10-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-03-20
                相关资源
                最近更新 更多