05 2011 档案
摘要:前一阵子我参加了一次笔试,其中有一道选择题让我印象深刻,是这样的:实例化一个X类型对象时所执行的顺序:A.调用X类型构造函数,调用X类型基类的构造函数,调用X类型内部字段的构造函数B.调用X类型内部字段的构造函数,调用X类型基类的构造函数,调用X类型构造函数C.调用X类型基类的构造函数,调用X类型构造函数,调用X类型内部字段的构造函数D.调用X类型基类的构造函数,调用X类型内部字段的构造函数,调用X类型构造函数我觉的这道题出得很没水平。在C++的世界里,我会毫不犹豫的选D。但是,由于C#引入了字段初始化器,所以选什么答案完全依赖于类具体是如何设计的。好吧,我们今天就来谈谈C#在类型实例化时都有
阅读全文
摘要:刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例。如下:[代码]这里的same会被赋值为true。也就是说s1真的和s2引用了同一个String对象。当然,应该注意到的是s1和s2都被统一赋值为同一个字符串“Hello”,这才是出现上述情况的原因。现在我们初步得出结论,当有多个字符串变量包含了同样...
阅读全文
摘要:我们知道,在匿名方法或者lambda中,可以访问或者修改该匿的定义范围内的变量。例如:int num = 1; Func<int> incNum = () => ++num;其中lambda表达式使用了在其外部定义的变量num。我们可以认为该段lambda语句块构成了一个闭包,而这个闭包捕获了外部变量num。好了,不说那么多让人看着难受的定义套话了。我们进入正题,看看在C#中变量是如何被捕获的。来看一个例子: public Func<String> CreateFunction() { String str = "我的幸运数字是"; int n
阅读全文
摘要:在C#中,重载自增、自减操作符的语法并没有什么特殊之处,如下:public static SomeType operator ++(SomeType some){ //具体实现}对于C#中的自增、自减操作符重载,无论前缀式或是后缀式,都统统只需要一个实现。也就是说无论我是这样:someType++,还是这样:++someType使用SomeType类型的自增重载,上述代码中的实现都完全足够完成任务。但是,前缀式++与后缀式++的行为毕竟不同,为什么他们只需要一份同样的实现就可以达到我们需要的目的了呢?另外,重载操作符的第一原则就是不应该改变操作数对象,而应该返回一个新的对象。否则不仅很可能会令
阅读全文