上一页 1 ··· 8 9 10 11 12 13 14 下一页
  2011年3月28日
摘要: 数组 所有的数组类型都隐含继承自System.Array,Array本身又继承自Object。 每个数组都有一些额外的负载信息,这些信息包括数组的维数、每一维的最低下限索引、每一维的长度、每一个元素的类型。 交错数组的定义示例: Point[][] myPolygons = new Point[2][]; myPolygons[0] = new Point[10]; myPolygons[1] = new Point[20]; 交错数组与CLS是不兼容的,CLS不允许一个数组的元素类型为Array,所以它不能在不同的编程语言中传递。数组基类Array Array实现了以下几个接口:ICl 阅读全文
posted @ 2011-03-28 21:53 辛勤的代码工 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 枚举类型 当编译一个枚举类型时,C#编译器会将其中的每个符号转变为类型的一个常数字段。 枚举类型就是一个定义了一组常数字段的结构而已。这些字段编译后会被存放在生成模块的元数据中,且可以通过反射来访问。 Enum的静态方法:static Type Enum.GetUnderLyingType(Type enumType)。该方法返回用于保存枚举类型实例值的基础类型。每个枚举类型都有一个基础类型,它们可以是byte、sbyte、short、ushort、int(C#选用的默认值)、uint、long或ulong。 我们可以在定义一个枚举类型的时候,让其中多个符号有着相同的数值。但当将一个数值转换为 阅读全文
posted @ 2011-03-28 14:36 辛勤的代码工 阅读(416) 评论(0) 推荐(0) 编辑
摘要: StringBuilder 为了获得更高的性能,StringBuilder的方法并不保证线程安全。如果我们的程序需要对StringBuilder对象做多线程操作,那么我们必须显式添加线程同步代码。字符串特定格式与语言文化 如果我们希望自己的类型能为调用者提供格式和语言文化选择的话,我们就应该使其实现System.IFormattable接口: public interface IFormattable { String ToString(String format, IFormatProvider formatProvider); } format参数告诉方法应该怎样来格式化对象;format 阅读全文
posted @ 2011-03-28 11:42 辛勤的代码工 阅读(1148) 评论(0) 推荐(3) 编辑
摘要: 关于回车、换行 String s = "Hi\r\nthere."; 以上代码将回车、换行字符硬编码到字符串中,但更加好的做法是使用System.Enviroment类型提供的一个名为NewLine的只读属性。 示例代码: String s = "Hi" + Enviroment.NewLine + "there."; 这样做的好处是,NewLine属性依赖于特定平台,根据底层平台的不同,它的返回值也不同。在Windows系统上运行时,该属性返回的字符串为"\r\n"。如果将CLR移植到UNIX系统上,NewLin 阅读全文
posted @ 2011-03-28 00:59 辛勤的代码工 阅读(403) 评论(0) 推荐(0) 编辑
  2011年3月27日
摘要: 有时我们会感到编译器自动产生的add和remove方法不够理想。如:我们需要频繁地添加或移除委托实例,同时我们又知道我们的程序是在单线程环境下运行,这时再对包含委托实例的对象进行同步访问的话就会损伤应用程序性能。 C#编译器允许我们显式实现add和remove访问器方法。示例代码如下:public class MailManager{ public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); //显式定义一个私有委托链表字段 private MailMsgEventHandler mailM. 阅读全文
posted @ 2011-03-27 21:59 辛勤的代码工 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 完整定义一个事件的方法 以Mail发送为例:定义一个类型用于保存所有需要发送给事件通知接受者的附加信息。按.Net框架约定,所有保存事件信息的类型都应该继承自System.EventArgs,且类型的名称应该EventArgs结束。 public class MailMsgEventArgs : EventArgs { public readonly string from, to, subject, body; public MailMsgEventArgs(string from, string to, string subject, string body) { this.from = 阅读全文
posted @ 2011-03-27 21:39 辛勤的代码工 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 当定义一个属性时,编译器会在生成的托管模块中产生以下3项:一个表示属性的get访问器的方法。只有为属性定义了get访问器方法时,才有这一项。一个表示属性的set访问器的方法。只有为属性定义了set访问器方法时,才有这一项。一个位于托管模块元数据中的属性定义,不管是只读、只写、或读写属性都有这一项。 阅读全文
posted @ 2011-03-27 15:51 辛勤的代码工 阅读(303) 评论(0) 推荐(0) 编辑
摘要: CLR提供了两个IL指令来调用方法:call和callvirt。 call指令根据引用变量的类型来调用一个方法。 callvirt指令根据引用变量指向的对象类型来调用一个方法。 当编译源代码时,编译器知道代码中是否在调用一个虚方法,并据此产生call或callvirt指令。产生call而不是callvirt会提高代码的性能,因为CLR不必检查引用对象的实际类型。 不管最终是通过call还是callvirt来调用一个实例方法,所有的实例方法调用都会接受一个隐藏的this指针作为方法的第一个参数,其中this指针指向当前正在操作的对象。 阅读全文
posted @ 2011-03-27 15:23 辛勤的代码工 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 操作符重载方法: CLR对操作符重载一无所知,它甚至都不认识操作符是什么。我们选择的编译语言定义了每个操作符的含义,以及当遇到它们时产生什么样的代码。 如在C#中,应用于基元数值类型上的+符号会使编译器产生将两个数相加的代码。 虽然CLR对操作符一无所知,但它却规范了编程语言应该怎样提供操作符重载。对于CLR来讲,重载操作符仅仅是一些方法而已。 以下代码:class Complex{ public static Complex operator+(Complex c1, Complex c2) {......}} 编译器会产生一个名为op_Addition的方法定义,该方法定义条目上有一个sp 阅读全文
posted @ 2011-03-27 15:14 辛勤的代码工 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 除实例构造器外,CLR还支持类型构造器(又称静态构造器、类构造器、类型初始化器)。类型构造器用于设置一个类型的初始状态。默认情况下,一个类型中没有定义类型构造器,只能手动定义。且类型构造器不能有任何参数。 示例代码如下:class SomeRefType{ //当SomeRefType第一次被访问时执行 static SomeRefType() {}}struct SomeValType{ //当SomeValType第一次被访问时执行 static SomeValType() {}} 类型构造器不允许添加任何访问限制符,它的访问限制被自动设为私有方式。类型构造器的调用由CLR负责,CLR会. 阅读全文
posted @ 2011-03-27 12:24 辛勤的代码工 阅读(279) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 下一页