注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

C#精髓摘要(2)  

2011-07-14 14:21:46|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接前一部分,地址在这里

C#精髓》一书属于O'Reilly出版的动物系列技术书籍,这一系列的书算是赫赫有名了,趁现在有空,走马观花地读一下这本书。

C精髓摘要(2) - Castor - 趁年轻,多折腾~~
封面上的动物是星鼻鼹鼠(Condylura cristata)。与所有鼹鼠一样,星鼻鼹鼠主要居住在自己挖的地下隧道中,觅食时才出来。鼹鼠的身体上布满了防水的灰色短毛,大约6~8英寸长。它们的显著特征是长长的爪子,用于挖掘和觅食都非常理想。它们的眼睛、耳朵很小,牙齿非常锐利。视力和听觉很差。

星鼻鼹鼠的名字来源于它们鼻子上的25个触须,触须可以帮助鼹鼠找到食物,主要是昆虫、蠕虫、小鱼和其他小的池塘生物。星鼻鼹鼠是鼹鼠家族中的游泳健将,可以潜入水中捕鱼。它们喜欢住在沼泽中,分布于美国东北部和加拿大东南部。
星鼻鼹鼠是哺乳动物,雌鼹鼠每年可以生3~6只幼崽。
星鼻鼹鼠对人类的危害比其他鼹鼠要小,因为它偏爱水生食物,很少到人类的后院活动。

属性

Property可以看作是面向对象的字段,提高了数据的封装性。属性访问和字段访问并没有性能上的差异。

索引器

提供了一种自然的方式,在封装了集合的类和结构中索引元素。可以申明多个索引器,接受不同的参数。

签名

方法的签名以方法参数列表中每个参数的类型和修饰字为特征。

按值传递参数,按引用传递参数

按值传递是默认方式,传递的是值的拷贝,

按引用传递使用修饰字ref,该修饰字使得两者指向同一内存地址。

out修饰字允许在使用前不赋值,但是要求从方法返回时必须赋值。

params修饰字

使用在方法的最后一个参数上,这使得该方法能够接收任意数目的某种类型参数。

long Sum(params int[] arr)

{

    long s=0;

    foreach(int i in arr)

    {

           s+=i;

    }

    return s;

}

然后调用的时候可以是Sum(1,2,3);或者Sum(2,45,7,8,9);等等。

重载方法

只要签名不同就可以重载,注意返回值类型不是签名的一部分。另外params也不是签名的一部分。

运算符重载

对于逻辑运算符,C#规定必须成对实现,例如==和!=<>,<=>=

定制隐式和显式转换

//假设已经预定了Note类型

//转化为Hz

public static implicit   operator double(Note x)

{

    return 400*Math.Pow(2,(double)x.value/12);

}

//Hz转化来,精确到半音

public static explicit   operator Note(double x)

{

    return new Note((int)(0.5+12*Math.Log(x/440)/Math.Log(2))));

}

...

Note n=(Note)554.37;//显式转换

double x=n;//隐式转换

实例构造器

类构造器首先在堆中创建一个类的实例,然后再初始化,但是结构构造器只是初始化。

类可以有隐式的实力构造器,但是结构却不行。

类构造器必须首先调用基类的构造器。使用基类构造器需要使用base关键字。根据base后括号中的参数决定调用相匹配的基类构造器。

注意字段、静态字段的赋值是在构造器执行之前完成的。

构造器可以是静态的,也可以是私有的。静态构造器不能被显式调用,而且程序无法知道静态构造器的调用时间。

this

一个变量,表示某个类或者结构实例的引用,只能从类或者结构的非静态函数成员中访问。

base

this类似,但是他表示的是一个覆盖或者隐藏的基类函数成员。

析构器和终结器

C#中声明析构器就是声明Finalize方法(称为终结器)的语法简写。

protected override void Finalize()

{

    ...

    base.Finalize();

}

建议:不要声明析构器或者依赖编译器生成析构器,而应该在需要的时候直接声明一个Finalize方法。

内嵌类型

在一个类型内部声明的一个类型,内嵌类型的好处:

可以访问外围类型的所有成员,不需要成员的访问修饰字

可以使用类型成员访问修饰字与其它类型隔离

从其外围类型之外访问内嵌类型,需要制定类型名(与静态成员相同)

接口

接口与类的区别:

接口只定义成员,但不实现,类似于纯抽象类。

类可以实现一个或者多个接口,但是类只能继承自一个类。

结构可以实现接口,但是结构不能从类继承。

接口的使用

声明接口和类相似,但不实现。实现接口只需要完成其中定义的方法,类似于类的继承。如果一个类既有继承基类,又实现了接口,则先继承基类,然后才是接口,如下:

public class Example:BaseClass,Interface1,Interface2...

另外,接口还可以扩展其他接口。如果多个接口有相同的方法,实现的时候使用显式实现(就是使用接口名.方法)

类或者结构可以隐式地转换为它所实现的接口。

数组

System.Array中派生而来。多位数组是数组的数组,包括规则数组和不规则数组。

使用GetLength方法返回给定维数的元素个数。

越界将会抛出IndexOutOfRangeException

枚举

枚举成员必须带上枚举的类型名,枚举值从0开始,自动加1,但是可以显式地指定值。

[Flag]属性用来告诉运行时环境,枚举值可以按位结合。

枚举和数值类型可以显式地相互转换。

委托

类似于函数指针,用于定义方法签名的类型。一个委托实例可以拥有和调用一个或者一组与其签名匹配的方法。注意委托方法的签名包括其返回类型。

如果委托的返回类型是void,那就是一个组播委托(Multicast Delegate),可拥有和调用多个方法。使用+=-=实现方法的添加和删除。委托按其添加的顺序调用。

用委托能解决的问题,也能用接口解决。但是用委托处理起来更漂亮一些,一般委托用于事件处理。

事件

本质上是一个对象通知其他对象发生了某事件的一个过程。该过程通常由组播委托封装。

事件定义委托:如delegate void MoveEventHandler(object source,MoveEventArgs e);

第一个参数是事件来源,第二个参数是由System.EventArgs派生而来,并保存有关事件数据。

类或者结构通过委托字段使用事件修饰符,声明事件。event关键字通过确保+=-=运算符能在委托上执行。

事件处理器是一种委托,用来处理事件。可以使用属性来暴露事件,而不是使用字段。

trycatchfinally

用于异常处理,捕获异常可以忽略异常的变量,而只需要知道异常的基本类型。

注意捕获多个异常的时候,只有第一个捕获程序能捕获到异常,因此先使用派生类异常捕获,在使用基类异常捕获,否则派生类异常可能达不到。finally能保证某些代码总能执行。

  评论这张
 
阅读(1070)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016