源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#语法相比其它语言比较独特的地方(一)

  • 时间:2020-11-06 05:05 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#语法相比其它语言比较独特的地方(一)
由于c#是由设计.net本身的人设计出来的,所以c#才是.net上最一流的语言。 实际上,已经有一百多万行c#代码用于实现.Net class framework。 要发挥出.net平台全部的效能,只有c#才是首选。 [b]1,switch语句可以用来测试string型的对象 [/b]这在c,c++,java等其他各主流语言中都是不可以的,唯独c#可以。 例如string a="haha";
[u]复制代码[/u] 代码如下:
switch(a) {     case "dfj":      ...     break;     case "djkfdjkf":     ....     break;     case "haha":      .....     break;     default:     .... }
[b]2、多维数组[/b] 这也是c#的特色,像java也没有多维数组,只有数组的数组。 c#中不但有数组的数组,也有多维数组。 数组的数组的特点是(拿二维为例),每一行的元素个数可以不同。 比如int [][] c=new int[2][];
[u]复制代码[/u] 代码如下:
c[0]={3,4,5,6}; c[1]={1};
c#中的多维数组的形式是这样定义
[u]复制代码[/u] 代码如下:
int [,] c=new int[3,4];
这样的c就是一个三行四列的二维数组。 [b]3,as与is[/b] java中也有类似于is的语法,用于在运行时判断一个对象的类型,叫做instanceof。 c#中就是一个is,判断o是不是一个string:   o is string as则是一个很窝心的功能,它首先对这个对象进行判断是否是某种类型,如果是就进行类 型转换,如果不是,就返回null。   如:   o as string [b]4,foreach语句[/b] java5以后for语句就多了foreach功能,这也许就是因为之前没有,而c#有,使得自己非常嫉妒,所以马上给添上了。 c#中的foreach功能是非常方便的。 例如遍历一个数组
[u]复制代码[/u] 代码如下:
string[] sentences=...; foreach(string st in sentences) {   .... }
[b]5,索引器和Property[/b] 不得不承认,我的偶像Anders实现出来的c#确实非常优秀。 我把索引器和Property归为一类。 都是从Class中读取某种属性,如果知道java的POJO的人肯定知道,java bean的标准形式 就是一堆private属性,然后一个getter,一个setter,这是标准,但实现确实使用的普通成员方法。 c#则更绝,它直接在Class中声明一个单独的field,然后在语法中直接设计了getter和setter的简化写法,这就是我们熟知的Property。 如:
[u]复制代码[/u] 代码如下:
public class WordCount {   private string m_string;   public string OutFile   {      get{...}      set{...value...}   } }
这样真正做到了封闭改动,开放扩展。 然后就是索引器,我觉得java中只有EL才有点做出了类似索引器的功能,这也只是方便了写jsp的人,而且很多厂商居然不在自己的容器中包含EL解析,这不得不让sun很无奈。 索引器就是给几个参数,返回一个属性。 如:
[u]复制代码[/u] 代码如下:
public int this[string index] {   get{...}   set{..value} } public int this[int x,int y] {   get{}   set{..value} }
[b]6,const和readonly[/b] 这点c#让我有点失望,对于非Ref型就是const,对于Ref型就是readonly。 而在java中,一个final就行了。当然对于不可继承的类,c#又有一个关键字sealed,虽然这让程序的含义更明确,但确实也多记了好几个关键字。 [b]7,delegate型别[/b] 说实话,这种奇怪的语法还是第一次见到,说跟C++中重载operator()的功能像吧,又不是太像。 总而言之,觉得它实现可能就是记下一堆同类型的函数指针,然后可以依次调用而已。 首先需要声明一个delegate型别,注意是型别而不是对象。 如public delegate void Action(); 注意既然是型别,那就跟enum,class是同等的,注意型别能够出现的位置。 然后我们就可以定义这种型别的对象来使用了。
[u]复制代码[/u] 代码如下:
Action aaa=new Action(...);
这个...代表的是符合这种函数原形的函数名字,注意使用delegate机制来调用,和直接调用函数本质上没有什么不同,就是说,当你调用成员函数的时候,当然你需要有一个对象,而调用静态函数的时候,你可以直接使用类名了。 这种delegate型别对象还有点特殊,它可以使用运算符+=和-=来增加或者减少本对象所代 理的函数集,当然还有更多的方法用来看当前我代理了多少个函数之类的。
[u]复制代码[/u] 代码如下:
aaa+=new Action(xxx); aaa+=new Action(ooo);
然后aaa(),意味着顺序调用xxx和ooo。 aaa.GetInvocationList().length可以看到当前代理了多少个函数。 你不用担心代理的普通成员函数的所属对象会被垃圾回收器回收,直到此代理对象不再引用这个函数,当然这个也是坏消息,说不定你都忘了还有某个代理对象代理着要死的对象的函数,让这个对象老不死。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部