代码之家  ›  专栏  ›  技术社区  ›  Caspar Kleijne

var:类型或关键字

  •  10
  • Caspar Kleijne  · 技术社区  · 15 年前

    MSDN 分类 var 在下面 Types

    在方法中声明的变量 作用域可以具有隐式类型var

    在这种情况下,“隐式类型var”是什么意思?

    严格地说,如果我有它解释给其他程序员。

    我可以说; var是一个 类型 ,或者我不得不说; 关键字 它指示编译器确定类型本身。

    这并不是要开始讨论var,也不是要学习var的用法。我只想知道如何准确地描述它,msdn有点混乱,就是这样。

    4 回复  |  直到 15 年前
        1
  •  14
  •   Jon Skeet    15 年前

    var 是一个 contextual keyword -以及 yield , add get

    变量 声明局部变量要求编译器 推断

    var list = new List<string>();
    var anon = new { Foo = "bar" };
    

    list List<string> ;类型 anon 是一个 匿名类型 在C#3中,允许使用匿名类型的强类型变量-变量仍然具有适当的编译时类型,即使您不能显式地声明该类型。

    有几个案例 变量

    var cantUseNull = null;
    var cantUseLambda = x => x.Length;
    

    还有其他的。在每种情况下 能够 只需在右侧强制转换表达式,以便编译器知道要使用什么-但在这种情况下,您最好直接声明变量。

    <plug>
    你可以在 C# in Depth . 幸运的是,有关这一点的章节仍然可以从 first edition page (你想要第8章)。我不记得我在第二版里对这一章做了多少改动。。。
    </plug>

        2
  •  11
  •   Eric Lippert    15 年前

    我能说var是 类型 ,或者我必须说var是 关键字

    这要看你怎么看。说真的!

    C#编译器对程序进行三种类型的分析,每个后续分析都使用前一种分析的结果。我们做的第一种分析是 分析;我们把文本转换成一系列的标记。假设你有

    class C { static void Main(){ var x = 123; } }
    

    接下来的分析是 文法的 将标记组织成组形成“解析树”的分析。在这种情况下,令牌将被组织到这个树中(缩进表示树中的嵌套级别)

    declaration of class: CLASS
      class name: IDENTIFIER(C)
      class body begins: LEFTBRACE
        declaration of method:
          method modifier: STATIC
          return type: VOID
          method name: IDENTIFIER(Main)
            formal parameter declarations:
              formal parameter declarations begin: LEFTPAREN
              formal parameter declarations end: RIGHTPAREN
            method body:
              method body begins: LEFTBRACE
                local declaration statement:
                  type: IDENTIFIERTHATMIGHTBEAKEYWORD(var)
                  local name: IDENTIFIER(x)
                  initializer:
                    assignment operator: EQUALS
                    integer literal expression: INTEGER(123)
                  statement ends: SEMICOLON
               method body ends: RIGHTBRACE
      class body ends: RIGHTBRACE
    

    . 如果这是一个语法合法的程序,那么它就在我们期望的类型声明的地方。

    但在这一点上,我们不知道“var”是指一个类型还是被用作关键字。这需要 语义的

    在这一点上有两种可能性。第一种可能性是全局命名空间中有一个名为“var”的类、结构、枚举、接口或委托类型。(此程序片段中没有“using”指令,因此我们不必检查任何其他名称空间,并且类型不是分部的,因此我们不必检查任何其他类型声明)。我们搜索所有被引用程序集的全局命名空间,寻找一个名为“var”的类型。我们还对所有其他文件中的类型声明进行语义分析,再次查找名为var的类型。

    如果我们找到一个,那么“var”指的就是那个类型。

    如果我们没有找到一个,那么我们假设“var”被用作上下文关键字,它引入了一个隐式类型化的local。

    所以,回答你的问题:

    ,代码片段“var”是一个标识符标记,上面写着“顺便说一下,这实际上可能是一个关键字”。

    语法上 ,标记“var”是 .

    语义上 当作用域中有一个称为var的类型时 ;如果没有这样的类型,并且“var”被用作本地声明的类型,则类型语法“var”不引用类型。更确切地说,它是编译器的一条指令,用于推断本地语言的实际类型。

        3
  •  0
  •   Cpt. eMco    15 年前

    两者兼而有之。从技术上讲,当使用var时,变量是强类型的,但是编译器确定类型。所以我想说,当你说“var是一种类型”时,你是最接近的。

        4
  •  0
  •   CVertex    15 年前

    变量 是一种类型,就像 是。。。但它到底是什么类型的??

    例如

    var b = "ahjhsad";
    

    在编译时, 将替换为 一串

    变量 作为程序员方便的简写,而不必编写

    List<string> myList = new List<string>();
    

    var myList = new List<string>();
    

    意思是一样的。