10.属性

属性可以看作一种智能字段smart field,因为它的包含了一个额外的处理逻辑。

在设计类型时,应将所有字段的访问限制都设为私有方式或者至少是保护方式,然后再以方法的形式让用户读取或设置对象的状态信息(访问器方法accessor method

C#编译器通过在我们指定的属性名称前添加get_set_来自动为生成的访问器方法命名。

对于CLR来讲,属性仅仅是定义在类型中的一对方法而已。

 

索引器indexer含参属性

语法:this[…]; 这意味着C#只允许我们在对象实例上定义索引器。

一个类型可以定义多个索引器,前提是这些索引器的参数集合各不相同。

 

11.事件

事件使一些对象之间的交互成为可能。CLR的事件模型建立在委托delegate这一机制上。委托为我们提供了一种类型安全的方式来调用回调方法。

待续……

 

基本类型

12.文本处理

数值和Char实例之间进行转换:

Ø 转型:效率最高,编译器会直接产生IL指令来执行转换,不会有任何方法的调用;

但缺点是编译器要将期望转换的数值类型看作是基元类型。//c=(Char) 65;

Ø 使用Convert类型:System.Convert类型提供了静态方法,为checked操作

//c=Convert.ToChar(65);

Ø 使用Iconvertible接口:Char类型和所有.NET框架类库FCL中的数值类型都实现了

Iconvertible接口,该接口定义了如ToChar这样的方法;但效率不高,存在值类型转化为接口装箱问题          //c=((IConvertible)65).ToChar(null);

 

C#认为String是一个基元类型不能用new操作符来创建String对象。

String s=”Hi there”;

String file=”C:""Windows”;

String file=@”C:"Windows”;         //@符号告诉编译器该字符串为一个字面字符串,可读性强

String对象最重要的特性是其恒定性。也就是说,一个字符串一旦被创建,就不可能再将其变长、变短、或者改变其中任何的字符。

 

 编译器一般将文本常量字符串放在托管模块的元数据中,然后在运行时使用一种称作字符串驻留string interning的机制访问它们。

 

String s=”Hello”;

Console.WriteLine(Object.ReferenceEquals(“Hello”,s);   

 

//当第一个引用字符串的方法被JIT编译时,所有嵌入在源代码中的文本常量字符串总会被添加到CLR内部的散列表中

运行时动态创建字符串:

String s1=”Hello”;

Sting s2=”Hel”;

String s3=s2+”lo”;

Console.WriteLine(Object.ReferenceEquals(s1,s3));

//返回false,因为动态创建的字符串并没有添加到CLR内部的散列表中

如果一个应用程序中所有的字符串比较都仅仅是比较引用而非字符集,且有一种方法可以将含有相同字符集的动态字符串变为托管堆中的一个字符串对象,则将大大提高系统性能。

 

S3=String.Intern(s3);     //返回已经存在的string对象的引用,如找不到,则该字符串将被添加到CLR内部的散列表中

S3=String.IsInterned(s3);     //找不到,返回null

只有当我们需要在应用程序中多次比较同一个字符串时,才运用字符串驻留技术。

 

字符串池技术string pooling:将多次出现的字符串只写入一次到托管模块的元数据中

由于string类型表示的是一个恒定不变的字符串,FCL提供了另外一种类型System.Text.StringBuilder,允许我们通过对字符串和字符执行动态操作来创建String对象。

System.Object中定义了一个共有的无参ToString方法,我们可以在任何类型的实例上通过调用ToString来获得该实例的字符串表达形式。                                                                                       

如果需要自己的类型为调用者提供格式和语言文化选择的话,我们应是其实现System.Iformattable接口:

Public interface Iformattable{

              String ToString(String format,IformatProvider formatProvider);

}  

将多个对象格式化为一个字符串:

String s=String.Format(“On {0:D},{1} is {2:E} years old.”,DateTime.Now,”Wallace”,35);

Console.WriteLine(s);

//String的静态方法Format接受一个格式化字符串,给格式字符串使用大括号中的数字来标识可替换的参数。

StringBuilderAppendFormat方法是我们能够以任何期望的方式来格式化对象

 

任何能够解析一个字符串的类型都提供有一个名为Parse的共有静态方法,该方法接受一个String,返回一个类型的实例。

posted on 2009-03-09 23:54  Pavel Yu  阅读(567)  评论(0编辑  收藏  举报