Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 变量:类型或关键字_C#_Language Features - Fatal编程技术网

C# 变量:类型或关键字

C# 变量:类型或关键字,c#,language-features,C#,Language Features,在类型下分类var 在方法中声明的变量 作用域可以具有隐式类型var 在此上下文中,“隐式类型变量”是什么意思 严格地说,如果我有它解释给其他程序员 我可以说var是一种类型,或者我必须说var是一个关键字,它指示编译器确定类型本身 注意:这并不是为了开始讨论var,也不是为了学习var的使用。我想一劳永逸地知道如何准确地描述它,msdn有点让人困惑,就是这样。var是一个与收益率、添加和获取一起的例子 换句话说,您可以将其用作标识符,而无需在其前面加@,但在某些地方(即局部变量声明需要类型名的

类型下分类
var

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

在此上下文中,“隐式类型变量”是什么意思

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

我可以说var是一种类型,或者我必须说var是一个关键字,它指示编译器确定类型本身

注意:这并不是为了开始讨论var,也不是为了学习var的使用。我想一劳永逸地知道如何准确地描述它,msdn有点让人困惑,就是这样。

var
是一个与
收益率
添加
获取
一起的例子

换句话说,您可以将其用作标识符,而无需在其前面加@,但在某些地方(即局部变量声明需要类型名的地方),它对编译器仍有特殊意义

使用
var
声明局部变量要求编译器根据右侧的表达式推断变量的类型。例如:

var list = new List<string>();
var anon = new { Foo = "bar" };
还有其他的。在每种情况下,您都可以在右侧强制转换表达式,以便编译器知道要使用什么-但在这种情况下,您最好只显式声明变量


您可以在中阅读更多关于此的信息。幸运的是,关于这一点的章节仍然可以从免费获得(您需要第8章)。我不记得我在第二版中对这一章做了多少改动…

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

var是一种类型,就像int是。。。但它到底是什么类型的

好的,编译器会根据行的其余部分为您解决这个问题(这就是隐含的意思)

e、 g

在编译时,var将替换为string

var被用作程序员方便的简写,而不必编写代码

List<string> myList = new List<string>();
List myList=new List();
程序员会写

var myList = new List<string>();
var myList=new List();
它的意思是一样的

我可以说var是一种类型,还是说var是一个指示编译器确定类型的关键字

这取决于你如何看待它。说真的

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

class C { static void Main(){ var x = 123; } }
我们首先确定这些标记是类标识符(C)LEFTBRACE静态无效标识符(Main)LEFTPAREN RIGHTPAREN LEFTBRACE标识符,可能的bikeyWord(var)标识符(x)等于整数(123)分号RIGHTBRACE RIGHTBRACE

在分析的这个阶段,“var”是一个标识符,上面有一个注释,说明它可能是关键字var,而不是标识符var

我们要做的下一个分析是语法分析,其中标记被组织成组,形成“解析树”。在这种情况下,令牌将组织到此树中(缩进表示树中的嵌套级别)

在这一点上,var在语法上被归类为一种类型。如果这是一个语法合法的程序,那么它就在我们期望的类型声明的地方

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

当我们对解析树进行语义分析时,我们会说“好的,有一个C类,它有一个方法Main,它声明了一个局部变量x。这个局部变量的类型是什么?”

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

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

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

所以,要回答你的问题:

从词汇上讲,代码片段“var”是一个标识符标记,上面有一个注释,上面写着“顺便说一句,这实际上可能是一个关键字”

从语法上讲,当标记“var”出现在语法中预期类型的位置时,它就是一个类型


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

请您向我解释一下我引用的msdn文章中的“隐式类型变量”是什么意思?这里的翻译有点迷失;)稍微编辑了一下问题,你在哪里太快了…@Caspar:这意味着你可以使用
var
来声明变量的类型,在这种情况下,变量的编译时类型就是右边表达式的类型。重要的是不要丢失格式,它是“隐式类型var”。Var是一种隐式类型,因为实际类型由编译器根据分配给它的内容确定,即
Var i=10,而不是显式类型的变量,即
inti=10隐式实际上意味着隐含或推断类型。这有用吗?@Caspar:我已经扩展了
var myList = new List<string>();
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