文章分类 -  Basic C#

Inherit [Inside compile]
摘要:什么是继承?继承的实现本质 1. 引言 本文不讨论继承的基本概念,我们回归本质,从编译器运行的角度来揭示.NET继承中的运行本质,来发现子类对象是如何实现了对父类成员与方法的继承,以最为简陋的示例来揭示继承的实质,阐述继承机制是如何被执行的,这对于更好的理解继承,是必要且必然的。 2. 分析 下面首先以一个简单的动物继承体系为例,来进行说明: public abstract clas... 阅读全文
posted @ 2007-09-11 13:27 BlueTzar 阅读(247) 评论(0) 推荐(0)
CLR虚方法多态调用的实现
摘要:父类定义的非虚方法是否在子类中有拷贝? 虚方法是如何实现多态的? 子类继承父类的虚方法实现是否和继承非虚方法机制相同? 如果子类隐藏了父类的虚方法,这又是怎样实现的? 当然问题不止这么多,关于接口方面还有很多很多疑惑,不过时间有限,一下也没办法全部弄清楚,有时间慢慢研究。我主要使用Windbg工具来跟踪调试,关于这个工具如何使用,Google一下就会有很多了。 这些都是我自己研... 阅读全文
posted @ 2007-09-06 18:03 BlueTzar 阅读(858) 评论(0) 推荐(0)
多态
摘要:一、什么是多态 面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。 同一操作作用于不同的对... 阅读全文
posted @ 2007-09-05 08:20 BlueTzar 阅读(344) 评论(1) 推荐(0)
接口实现和虚函数重载的区别
摘要:Item 20: Distinguish Between Implementing Interfaces and Overriding Virtual Functions 粗略的看一下,感觉实现接口和虚函数重载是一样的。你定义了一些对象,但是这些对象是在另一个类型里申明的。你被第一感觉骗了,实现接口与虚函数重载是完全不同的。在接口里定义的成员默认情况下,是根本不存在实际内容的。 派生类不能重载基类... 阅读全文
posted @ 2007-09-05 08:19 BlueTzar 阅读(2429) 评论(0) 推荐(0)
IL解析:ref,out,params,lock,for,foreach
摘要:了解MSIL可以让我们了解许多其他人所不知道的内幕。本文就试图通过MSIL,剥开一些披在C#上面的漂亮外衣。 using System; public class RefOutParam { public void NoRef(int i) { i = 500; } public void TestRef(ref int i) { ... 阅读全文
posted @ 2007-08-31 09:56 BlueTzar 阅读(528) 评论(0) 推荐(0)
多态基本功--What will be the output of the following program ? (and why?)
摘要:using System; class A { public virtual void Foo() { Console.WriteLine("Call on A.Foo()"); } } class B : A { public virtual void Foo() { Console.WriteLine(... 阅读全文
posted @ 2007-08-29 22:19 BlueTzar 阅读(354) 评论(0) 推荐(0)
New与多态
摘要:1) 使用基类继承多态,有一点特别需要注意的就是:基类(抽象或者非抽象)中需要获得多态效果的成员必须有 abstract 或 virtual 修饰。使用 new 来重写的成员不能形成多态 2) 多态就是使得你能够用一种统一的方式来处理一组各具个性却同属一族的不同个体的机制。new 重写后的成员符合这个范畴 1. 通常怎样用多态 假设我有一个类,里面有一个 PrintStatu... 阅读全文
posted @ 2007-08-29 22:09 BlueTzar 阅读(326) 评论(0) 推荐(0)
实现 Finalize 与 Dispose 来清理非托管资源
摘要:类的实例经常使用那些没有通过运行时而被管理的资源(如窗口句柄(HWND)、数据库连接,以及I/O等等)来封装控件。因此,你应该同时提供明确的方式与隐式的方式来释放这些资源。通过为对象(C# 与 C++ 中的析构器语法)实现被保护的 Finalize 方法来提供隐式的控件。垃圾回收器会在不再有任何有效的对象引用之后调用这个方法。 在有些情况下,你可能需要为程序员提供使用一个能够在垃圾回收器释放对象之... 阅读全文
posted @ 2007-08-28 21:25 BlueTzar 阅读(285) 评论(0) 推荐(0)
定义常量的两种方法
摘要:在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),它的书写方式如下: public const int MAX_VALUE = 10; 为什么称它为静态常量呢,因为如上... 阅读全文
posted @ 2007-08-24 07:29 BlueTzar 阅读(6781) 评论(0) 推荐(0)
提供一个有意义的ToString函数
摘要:在编写自定义类型的时候,即使我们不写ToString函数,系统也会自动提供ToString函数,例如: public class clsUserInfo { private string strUserName; …… } 不过系统所提供ToString函数,并不做太多的事情,无法真实的反映当前对象的一些属性,就如上这段代码,调用ToStri... 阅读全文
posted @ 2007-08-23 13:30 BlueTzar 阅读(373) 评论(0) 推荐(0)
使用Conditional属性来代替IF/ENDIF程序块
摘要:在编码的时候,有时候需要添加一些DEBUG信息,来为了方便调试程序,但是到了真正发布的时候,又不希望把这些信息进行编译发布。那么在以前C或者C++编码的时候,用IF/ENDIF来定义程序块实现这个功能,而此方法在C#中可以继续沿用。 这种用IF/ENDIF来增加DEBUG信息块有两种方式,如下: 方式一,在一个函数中进行嵌入,例如: #if DEBUG Trace.WriteLine... 阅读全文
posted @ 2007-08-23 13:10 BlueTzar 阅读(464) 评论(0) 推荐(0)