现在的位置: 首页 > 综合 > 正文

学习C#语法随想

2013年10月04日 ⁄ 综合 ⁄ 共 1180字 ⁄ 字号 评论关闭

这一点在我学习Basic的函数时没有意识到,在学习C的函数指针时没有意识到,学习C++操作符重载时还没有意识到,直至C#的属性attribute时,豁然开朗,原来计算机语言在不断地抽象,让计算机世界更简单,而不是更复杂。

C#的关键字数量空前地增长,但这并没有使C#语法更复杂。C#编译器工程师在分析众多关键字时,发现publicprivate等修饰词可以有一种统一的处理模式,并且能够被扩展,于是创造了Attribute语法。
不足的是我们至今无法用类似于这样语法object.attribute.MyAttribute来引用属性,而只能通过昂贵的反射机制来访问。或许引入属性语法借鉴于某种语言,但我仍可以假设这是C#编译器工程师的创新。


C#中越来越分不清是关键字,还是属性,还是操作符,区别仅仅是在VS里有不同的颜色标记。
其中有部分关键字是控制语句的,如if,using,foreach。我们知道using等效于展开成try...finallyforeach等效于展开成for循环,for一定可以展开成ifgoto语句,所以C#在不断地抽象控制语句,但却没有提供一种允许程序员自定义语句结构的语法。我前瞻性地认为,C#会引入新的机制允许自定义控制语句,或许别的什么语言已经有了类似的实现,可以像下面这样调用:
Control.Run(myif,(a == 1),{b=1;});  //
调用我自定义的if语句,按某种方式计算表达式( a == 1),然后在适当的时候调用语句块{b=1;}
事实上多态性机制正在做类似这样的事情,允许在派生类重写基类的同名函数,在运行期动态绑定函数实体并调用。而委托delegate的引入,是对函数调用机制更高级的抽象,只要函数签名一致即可调用,甚至可以连续调用一系列函数。


类,class,只不过是一种更复杂的语句控制。当程序员定义了类以后,相当于定义了一系列语句执行序列:

  • 默认初始化按位清零;

  • 类静态成员初始化;

  • 类静态构造函数调用;

  • 实例成员先按文本先后次序声明初始化;

  • 访问构造函数成员初始化列表,开始按继承树反序初始化基类及实例....

  • 基类静态成员初始化;

  • 基类静态构造函数调用;

  • 基类实例成员初始化;

  • 基类实例构造函数调用;

  • 最后调用本地构造函数完成初始化。

类展开后,虽然看起来这个过程相当复杂,但这正好是对现实世界最聪明的抽象!

实例是对问题域对象的抽象,类是对实例的抽象,基类是对派生类的抽象,元类Type则是对所有类的进一步抽象。虽然我们不能自定义元类,但已经有泛型来模拟定义一个元类,定义一个泛型相当于定义了一系列具有相似行为的class

自从JAVA不支持运算符重载以来,就注定JAVA无法从语法层面进一步抽象,不能扩展编译器能力,不可能像C++C#一样发展成为一种自描述的计算机语言。说不定JAVA可以发展成另一门令人头疼的外语 

抱歉!评论已关闭.