蛙蛙请教:c#面向对象编程的有些抉择问题?

什么情况下用class,什么情况下用struct?
如果要创建的对象有行为的话用class,如果只是保存数据的话用struct,但是尽量用class。
关于明辨值类型和引用类型的使用场合请参考下面的链接。
http://www.microsoft.com/china/msdn/library/langtool/vcsharp/EffectiveCsharp.mspx
关于值类型使用场合请参考以下链接
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpgenref/html/cpconvaluetypeusageguidelines.asp

什么情况下用const,什么情况下用readonly?
const是在编译的时候确定的,而readonly是在执行的时候确定的,如果是全局不变的数据,并且是值类型可以用const声明。而readonly有个在构造函数里再进行初始化的机会,所以如果在web.config里提取的配置信息可以用readonly来声明。

什么情况下用inteface,什么情况下用 base class,什么情况下用delegate?
如果确定以后不会更改可以用interface,如果以后可能要更改就用基类,基类还可以完成一些默认的操作,而且修改后,派生类会自动继承新成员,如果是接口修改的话,实现接口的类就不能运行了。如果单独定义一种行为或者一组结合不紧密的行为可以用接口,如果定义的一系列结合紧密的行为可以用基类。因为这些行为结合紧密的话,以后可能还要改动,如果结合不紧密的话,就可能很少修改,即便修改也不一定要动封装好的东西。所以我感觉基本的东西用基类来定义,而扩展的东西用接口来定义。把基类和接口结合起来使用,比如说定义生物,动物,鸟,人这几个对象吧。把生物定义成一个基类,在这个基类里把“有生命的”,“由有机物组成”这些放到这个基类里,而定义一系列接口,比如“能动的”,“没有细胞壁”,“有羽毛的”,“会使用工具的”。由这个基类派生并且实现了“能动的”接口就是“生物”,再把这个作为基类,再实现一个“有羽毛的”接口,就是“鸟”,而再实现“会使用工具的”接口,就是“人”了,不知道我这样打比喻对不对。
而委托相当于一个方法的指针,不能向接口那样可以声明类的任何成员,在使用回调和实现观察者模式的时候再用委托。
关于动物和植物的区别,参考下面的链接
http://www.czkp.org.cn/kxwx/smam-04.asp


什么情况下用enum?什么情况下用hashtable?什么情况下用位域枚举?
enum的成员的值都是整形的,是值类型,保存再堆栈上,而hashtable是引用类型,保存在托管堆上。如果声明的东西是不便的,而且是一组常量,可以用枚举,而是键/值对儿的话就用哈希表。


表示业务实体时,什么情况下用自定义实体类,什么情况下用dataset?
如果只传递单个实体,并且大多是本地部署,就用自定义实体类表示业务数据,但是如果是一组数据,而且还要排序什么的,就考虑用dataset,虽然自定义实体类也可以放在数组里,但是还要实现某些接口才能够排序,而且好多dataset提供的优势他都没有。再一个自定义实体在序列华方面还得手动执行,而dataset直接就可以了。
我有个想法,把业务实体的架构用Schema公开出去,向biztalk那样,然后业务实体在传输中使用二进制流传输,传输过去后根据公开的Schema把解序列化的数据转换成所需要的实体,这样如果业务实体的架构改变了,改个Schema就OK了,维护也方便,


什么情况下用数组,什么情况下用集合?
能确定成员数量的情况下用数组,不能确定的情况下用集合,.NET下的好多关于集合和数组的接口和类我还没仔细研究过,不知道.NET类库开发者是怎么考虑的。


什么情况下用静态成员,什么情况下用非静态成员?
我总感觉要实现全局变量的时候就用静态成员,或者是实现面向服务(SO)的时候用。而如果要实现数据封装和面向对象(00)的时候就应该用非静态成员。

什么情况下用静态类?什么情况下用非静态类?
到现在不知道啥是静态类,和VB下的模块差不多?是不是只包含静态成员的类就叫做静态类呀。


暴露数据的时候什么情况下用公有字段,什么情况下用属性?
如果是只读字段或者常量字段,就做成公有字段就行了,其它情况下都用属性来包装数据,因为属性可以被派生类继承,而且在SET访问器类还可以做数据完整性的测试,而且还可以在他里面抛出异常,或引发事件等,这就是属性的好处。
关于字段和属性的使用场合请参考以下链接
http://www.microsoft.com/china/msdn/library/langtool/vcsharp/EffectiveCsharp.mspx


什么情况下用重写,什么情况下用隐藏?
虚拟的方法重写,没有声明虚拟的方法隐藏呗。但是JAVA里好像方法默认是可以被重写的,也就是虚拟的,不知道C#怎么考虑的。

对于c#面向对象偶有好多不明白的地方,以上是偶的一些理解,肯定有误解的地方,恳请大家指点补充。

原文地址:https://www.cnblogs.com/onlytiancai/p/197282.html