CLR类型设计之方法与构造器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CLR类型设计之方法与构造器相关的知识,希望对你有一定的参考价值。
C#语言中最常用到的就是方法的语法,如果在控制台应用程序中,一定要有一个Main()方法作为程序入口,本文讨论的不是方法实现也不是为什么要写方法,而是来讨论下如何构造器和扩展方法。
无论学习那门语言都要学习函数体,C#,JAVA,php,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器。
方法就是某个类相关的函数,也可以返回简单的基元类型或者什么也不反回,方法可以定义其公开性,如果使用static修饰符则变为静态方法。
属性是可以从客户端访问到的函数组,访问形式和访问类相同,C#为读写类中的属性提供了专用语法。
构造器是实例化对象时自动调用的特殊函数,必须与所属的类同名,且不能有返回类型,构造器用于初始化字段的值,可通过不同参数进行重载。
终结器类似与构造函数,但是CLR检测到不再需要某个对象时调用他,他的名称与类相同,但前面有一个~符号
运算符执行的最简单操作就是“+’“-’“*’“/’这些基本运算,C#也支持重载运算符
索引器允许对象以数组的或集合的方式进行索引。
构造器
以上就是函数体的基本成员和方法的基本定义,接下来我们先说一下构造器,为什么说构造器?
因为构造器实际上会帮我们很好的理解方法一个类的初始化过程,我们会发现无论是一个对象实体或是方法,大部分都会放在cs文件中,而构造器是初始化对象的,我建立了一个Student的类里面只有一个字段一个函数体,在Main函数中我初始化了Student类,运行就会发现构造器函数以及执行,并且调用了方法write
运行后输出的结果
当然在我们平时写代码的时候没有必要去可以初始化构造器,C#编辑器会自动为其初始化构造器,这个构造器会默认的把所有成员字段初始化为标准的默认值。我们可以为一个类提供任意多的构造函数,但其签名不能相同。
构造函数中,还有一个特殊的存在, readonly
关键字是一个可在字段上使用的修饰符。 当字段声明包括 readonly
修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中。
可以说
readonly一般只在构造器初始化的时候赋值,其余的时候不能改变他的值。
扩展方法
关于扩展方法,在用途上实际上用的不是很多,通常我们如果发现一个类所提供的方法不全时,我们会自己去写一个别的方法代替,实际上扩展方法也是重写一个方法的,但是扩展方法解决了三个问题,第一如果我们要获取的东西在整个程序属于常用的,但是如果我们只是额外写一个普通方法,那么调用上就会多一步,第二我们希望代码的顺序看起来更整洁也更加高大上。第三共用问题。
我们通过一个例子来看,如果我们想得到一个StringBuilder对象里某个字符串出现的位置,我们可以写一个获取字符串第一次出现的方法,还是在刚才Student类中,我们定义了一个indeof方法,参数为StringBuilder和一个char类型
如果我们想要调用上面的方法,那我们需要执行如下操作,先声明一个StringBuilder对象,然后调用sb.Replace方法将.替换成!,然后获得!第一次出现的位置,代码执行时没有任何问题,但是这串代码并不理想,看起来很繁琐
但是如果我们将方法改变一下,只需要在参数前面加上this,这个方法就会变成StringBuilder类的扩展方法。
我们在重新去写上边代码时,就可以很简单的写成下图,方便理解,也符合代码执行的逻辑程序。
但是扩展方法不易乱用,尤其是在基类中扩展,其所有派生类都会有这个方法,很容易造成不应该出现的地方出现,另外扩展方法必须为顶级类,不能在嵌套类中使用扩展方法。扩展方法可以扩展很多种类型,包括但不限于,扩展委托,枚举,接口。
以上是关于CLR类型设计之方法与构造器的主要内容,如果未能解决你的问题,请参考以下文章