C#中的标识符分这么几种:C#关键字、类型名、变量名、方法名。思考回忆下【标识符命名的规则】
其中有这么几条值得注意:
其一,C#关键字统统为小写,什么是关键字?它是编译器内建识别的标识符,是最为底层的标识符,所以类型名、变量名、方法名都不能和它重名,这在任何语言中都是一样的;C#关键字有哪些?这个看似简单的问题,其实还真不容易说的清楚,最好分类总结,C#的关键字已不是C语言中32个关键字那么简单,我就简单分下类,不做统计:
有关类型定义的关键字:{class,struct,enum,interface,delegate}这是标准的CTS类型系统
有关类型的关键字:{int,string,bool,object,……..}
这一集合都映射C#中的实际结构类型。
有关语句的关键字:
{if,else,while,do,for,switch,case,return,using,foreach,…..}呵呵看看有没有漏得得。
有关运算符的关键字:{new,as,is,sizeof,typeof,…..}
有关异常的关键字{try,catch,finaly,…}
有关类型和变量及方法修饰符的关键字:{public,private,internal,static,abstract,new,virtual,override,….}
有关参数的:{ref,out,..}
其它{var,where,event,in,null,this,base,get,set,value(不算)}
………………….
其二,类型名规则。类型名在同域下不能重名。C#的类型系统更为复杂。本质上讲,类型是有程序集界定的,命名空间逻辑组织限定的。有以下总结:
第一,要求就是类型的完全限定不允许重名,这是最根本的;
第二,要求自身类型定义中不允许出现与类型同名的变量名。这个要求(规定)就较为尴尬了,也就是说除此之外,所有其它的情况下都可以定义和类型同名的变量。这样下来,所谓的类型和变量,类型名和变量名就较为不好理解了,竟然可以同名?!!!
其三,C#的变量名。变量名最大域作用也就是限定在类的定义中(这反映出CIL是完全基于栈的语言),这些是类的数据成员;函数参数可以定义,函数内部可以定义,块语法也可以定义,这些统称局部变量。局部变量可以覆盖类的数据变量,但局部变量不能彼此覆盖(这一点和C/C++是完全不同),C#的做法消除了由于局部变量覆盖父级同名变量可能意外情况!
其四,C#函数名实质上应该看成一个字面量(字面值)。在同域条件下,函数签名不应相同,就是所谓的函数重载。
总之,无论如何,C#标识符的规则就是不应使编译器对标识符在可能的情况下产生二义性。
在同域条件下,类型名(只能在命名空间或嵌套类中)、函数签名(类内)不应该重名;局部变量可以覆盖类的数据变量,但局部变量之间不能覆盖;允许类型名和变量名重名,不允许封闭类型和定义的成员重名,在类内不允许类的成员各个之间重名,但在函数参数和函数内允许函数名和变量名个重名