C# 类、字段、属性简述

C# 类、字段、属性简述
一、关键字
 1、internal 只能在当前项目中使用,同一命名空间内
 2、public 可以在任何地方使用,没有使用限制
 3、pravite 只能在类本身进行访问,子类和外面的类都不能访问
 4、protected 只有本身和子类可以访问
 5、abstract 类本身不能被实例,只能继承、
 6、sealed 不能派生,只能实例化
 7、partial 部分类修饰符 ,一个类的内容可以写在多个文件中
 8、static 静态修饰符,不需要创建可以直接使用
 9、virtual 虚方法,表示这个成员可以由派生类型重写
 10、override 重载,表示派生类型重写了基础类型 的成员
 11、new 应用于嵌套类型、方法、属性、事件、常量或者字段,表示该成员与基类中类似的成员没有关系
二、静态类
 在C#中允许通过使用C#中的关键字static定义非实例化的类,被称为静态类,用关键字static表示。该关键字仅能用于类,不能
 
用于任何值类型。
1.静态类必须直接从System.Object派生。
2.静态类不能实现任何接口,因为只有使用类的实例时才去调用类的接口方法。
3.静态类只能定义静态成员。
4.静态类不能用作字段,方法参数或局部变量,这些方式表明变量引用了实例,这将产生错误。
.NET中提供了诸如Console,Math,Environment和ThreadPool等类都是静态类。
三、部分类
 如果所创建的类包含一种类型的许多成员时,就极容易混淆,代码文件也比较长,这里可以压缩和扩展各个代码区的办法进行处
 
理。团队编程,可以使用部分类的概念,即,就是使用部分类定义,使类的定义横跨多个文件。例如,可以把字段,属性和构造函
 
数放在一个文件中,而把方法放在另一个文件中。为此,只需在每个包含部分类定义的文件中对类使用partial关键字即可。
两个文件的类型中都采用关键字partial。将这两个文件编译在一起过程中,编译器将代码组合,在最好得到的结果.exe或.dll程序
 
集中生成一个类型。
部分类的概念多用在一个类实现了有多个方法的接口,这些方法只支持接口功能,与类中的其他代码可能没有什么关系希望使接口
 
实现代码与主类的代码相分离
四、密封类
   在定义一个新类型时,应把类的可见性定义为sealed。如果类是sealed,将来就无需破坏兼容性将类改变成非sealed。但是,一
 
旦类是非sealed,将来就不可能改成sealed,因为这将破坏所有派生类的兼容性。如果非sealed的类定义了非sealed的虚方法,那
 
就必须在新版本的类中保存虚方法的自定义调用,否则将来可能会破坏派生类的兼容性。
在性能方面体现也很明显,编译器为了确定所调用方法的类型必须在运行时查找对象的类型,但是如果该类是sealed的类型,编译
 
器知道该类不可能是派生类,只能是基类。
类必须有保护它自己的状态,而且永远不会破坏类本身。当类为非sealed时,如果类成员是可访问的,那么派生类就可以访问并操
 
作基类的状态,并且派生类也可决定是否访问基类中的状态。所以对于一些比较重要的类,多采用sealed,避免一些漏洞的存在。
 
 
五、字段-常量和只读字段
   常量是值永远不会改变的符合。定义一个常量符号时,它的值在编译时必须是确定的。通过编译后,编译器将常量的值保存在程
 
序集(assembly)的元数据中,因为常量的值是永远不变的,所以常量总是被当作静态成员,而不是实例成员。
只读字段可以被看作是常量的替代品,虽然常量在性能上优于只读字段(因常量不需要分配内存),但是我们还是要多用只读字段,
 
而要减少用常量的频率。因为,如果我们想编写一个dll程序,从该dll程序中,我们想把常量和只读字段的值分别要其改变,常量
 
只能重新编译,而只读字段由于是动态内存分配,它不需要重新编译。只需要充执行即可。
 
六、构造器
 1、引用类型构造器
    构造器是允许将类型实例初始化为有效状态的特殊方法。创建引用类型的实例时,首先为实例的数据字段分配内存,接着初始化对象的系统开销字段(类型对象指针和同步块索引),最后调用类型的实例构造器设置对象的初始状态。
创建引用类型对象时,在调用类型的实例构造器之前,为对象分配的内存始终被清零。与其他方法不同,实例构造器永远不能被继承,所以下述修饰符不能用于实例构造器:
virtual,new,override,sealed,abstract
如果定义的类中没有显示地定义任何构造器,那么编译器将定义一个默认的构造器,该构造器只是调用基类的无参构造器。如果类的修饰符为static(sealed和abstract),那么编译器不会在类的定义中生成一个默认的构造器。
一个类型可以定义多个实例构造器。每个构造器都必须拥有一个不同的签名,而且每个构造器可以拥有不同的访问性,类的实例构造器在访问从基类继承的任何字段之前,必须调用其基类的构造器。但是在反序列化对象时,不需要调用构造器。不推荐在构造函数中调用虚方法,因为如果一旦重写了要初始化的类型的虚方法,那么派生类中被重写方法的实现将被执行,但是在该继承层次结构中,并非所有的字段都已被完全初始化。因此会出现一些无法预测的行为。
 2、值类型构造器
 值类型的构造器与引用类型的构造器截然不同,值类型实际上不必在其内部定义构造器,就可以把相应的值类型初始化为0或null。但是确实可以写值类型的构造器,但是值类型的构造器只有在被显示调用时才会执行。C#不允许值类型拥有无参构造器,并且也不能拥有实例字段的初始值。
 
七、值类型与引用类型
   选择值类型还是引用类型是直接关系到类库好坏的设计关键。在C++中由于所有的类型都是值类型,所以C++程序速度很快,但很不安全;在Java中由于所有的类型都是引用类型,所以Java程序很安全,但是效率最差;在C#中,二者取得了平衡,但是选择值类型还是引用类型又是一个问题。
首先值类型不支持多态,比较适合存储供应用程序操作的数据,并用于较小的轻量级的类型;引用类型支持多态,应该用于定义应用程序的行为,并用于构建整个类层次。
在真正的实际类库过程中,如果具有比较简单的结构,或者是作为数据的载体,就应设计为值类型,因为值类型的速度比较快。但是若定义应用程序的行为类型应设计为引用类型,毕竟,引用类型支持继承层级,能获得安全的行为。
 
八、属性
 1、无参属性
    面向对象设计和面向对象编程的一个主要特点是数据密封。数据密封意味着类型的字段永远不会公开地对外提供,因为这样容易编写出不恰当使用字段的代码,从而破坏对象的状态。基于以上原因,强烈建议采用内联的设计方式,把类中的所有字段设为private。当然,如果想对该字段进行一些逻辑校验,可以在类中采用增加方法的手段进行判断。但是如果应用属性的方式,不仅满足了对字段的逻辑校验,而且还能以一个字段的形式进行访问。
每个属性都有一个名称和一个类型(不能是void)。定义属性时,通常指定get和set两个方法,但是可以省略其中的任何一个方法而达到只读或只写的效果。其实,在编译器编译带有属性的类时,会自动生成get_属性和set_属性两个方法,以对应属性的运行
 2、有参属性
    索引器的最大好处是使应用程序更加容易编写。因为索引器允许类的客户对对象进行索引,就像对本身在数组中一样。
因为类本身被作为数组使用,所以this关键字被用作索引器的名称。所有的索引器必须至少拥有一个参数,也可以有多个参数。这些参数以及返回类型可以是任意的数据类型(除void外)
下面介绍一下创建自己的、强类型化的集合。可以继承CollectionBase类,由于该类有接口IEnumerable,ICollection和IList,但只提供了一些要求的执行代码,特别是IList和InnerList,List可以通过IList接口访问项,InnerList则是用于存储项的ArrayList对象。
很明显,对象的索引器可以帮助我们提高开发效率,只有在将对象作为数组对待可以使程序更加直观,才应该使用索引器,否则还是不易使用索引器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值