C# CLASS 相关知识
类:两个理解角度,
* 用来描述问题域的抽象
* 用来创建对象的蓝图。
类的构成:
Class Name
{
数据成员:
实例变量
静态变量
函数参数,返回值
嵌套类型(class/struct/enmu/interface)
函数成员:
构造函数
析构函数
行为方法(实例方法、静态方法)
属性:用来访问Private变量的get+用来修改Private变量的set
索引器:用来访问类中的数组
操作符:重载
嵌套类型成员(class/struct/enmu/interface):
只在此类中是使用的类、结构、枚举、接口等,降低类型描述的复杂性
}
实例方法:
同一个类的不同对象共享同一方法的拷贝,编译器会将对象作为一个参数暗自传送给实例方法。
而不是为每个实例都创建一个拷贝,从而节省资源。
方法参数:
1. ref 引用类型参数
2. out 也是引用类型参数,但是可以使用尚未赋值的变量
3. 参数数组的问题:可以接受不同数量的参数,即用任意多个和参数数组类型相同的变量作为参数
只能写在参数的最末一个(int a,int b, params int[] number)
只能是一维数组 int[,]不可用,int[][]可以
不能与ref/out 同时使用
方法重载: 重载的条件是方法信号不同,方法信号包括方法名字,参数数量、类型和顺序
返回类型,params 参数,形式参数的名字都忽略。
this 的使用情况:
区分形式参数、本地变量与实例变量
将当前对象的引用作为一个参数传递给另一个方法
将当前对象的引用 返回给此方法的调用者
构造函数:
* 如果类中包含一个或多个实例构造函数,那么编译器不会为类添加缺省的构造函数。
* 在全是静态成员的类中,也可以使用Private的构造函数
* 可以定义静态的构造函数,用于执行在第一个实例对象创建前要做的事情。不能添加访问修饰符和参 数,其形式为 static className() { ... },由运行时自动调用。
* 通过使用构造函数初始化器(: this( parma1,param2...))可以减少不同构造函数中包含重复代码
只读成员与常量的异同:
同:都用来表示一个不变化的值
异:常量在源代码中指定值,只读成员在运行时赋值,比如银行账号就适合作为只读变量在创建时构造 函数中赋值。
析构函数:
在C#中,一般是不用程序员去编写GC或者析构函数的,系统会自动进行垃圾回收。如果写了析构函数,反而会影响效率。只有在处理特定的资源时,比如非托管代码的资源时,可以自己编写析构函数来释放资源。
Dipose:用于释放非内存有限资源的释放。可以摆脱析构函数执行的不定时性。
为了避免因dispose和析构函数删除同一对象两次引起的运行时错误,可以在dispose方法中使用GC.SuppressFinalize
如何编写直观易懂的代码:
属性的使用,在功效上和存取器相同,因为内联技术甚至更快,但是使用混合get、set的属性可以使的对对象私有成员的赋值形式与"="形式保存一致;而且可以延迟不必要的初始化工作。
索引器的使用, 将集合类型的数据写成一个类,并可以添加一些方法,更直观的是对于这样的数组访问可以使用和数组形式一致的方式,对象名[索引值],索引值可以是各种类型。
操作符重载:为了保持语义和形式的一致性,操作符重载是一个不错的方式,但是有几点要注意:比较操作符(<和>,>=和《=,==和!=)必须成对重载,二元操作符的话第一个参数必选是操作符所属类型。必须声明为pubic staic
自定义用户类型准换:
隐式转换:public static implicit operator Type_Convert_TO(Type_Convert_From)
显式转换:public static explicit operator Type_Convert_To(Type_Convert_From