黑马程序员_学习日记11_复习C#(高级)

时间:2021-06-07 00:27:19

C#高级

一、面向对象:C#Java都不支持多重继承,可以用“接口”

 

二、方法:

1、方法和C语言中的函数共享同一个理念。

方法的调用,则需要先实例化类,然后调用类的某个方法。例:Doctor dc = new Doctor();实例化了类,然后dc.doSth()就是调用了Doctor类的方法。如果方法是静态的,即static,则不需要实例化类,直接使用类名.方法名就可以调用了。如Console.WriteLine(Doctor.doAnth());即是直接调用了静态的doAnth方法。

2、参数可以通过引用或者值传递给方法。在调用方法前后,引用类型的修改会保留下来,而值类型的修改不会保留下来。

       3ref:强迫参数通过引用传递。例:

static void FunctionTest(int[] arr,ref intx) 调用的时候也加上ref,即

FunctionTest(arrTemp,ref y);

注意:在调用有ref参数的方法时,必须将参数要传递的参数提前初始化。但在调用out参数的方法时,就不必提前初始化。

 

三、构造函数:

       1、静态构造函数:在C#中我们可以给类定义一个无参的静态构造函数,只要创建类的对象,该方法就会执行。该函数只执行一次,并且在代码引用类之前执行。

       一般在类中有一些静态字段或者属性,需要在第一次使用类之前从外部数据源初始化这些静态字段和属性,这时我们就采用静态构造函数的方式来解决。

       静态构造函数没有访问修饰符,其他C#代码也不调用它,在加载类时,总是由.NET运行库调用它。一个类只能有一个静态构造函数。

       注意,无参的实例构造函数可以和静态构造函数在类*存。因为静态构造函数是在加载类时执行的,而实例构造函数是在创建实例时执行的,两者并不冲突。

2、 构造函数初始化器:有两个构造函数,有可能两个构造函数需要初始化同一个字段,这种情况,C#中有个特殊的语言,称为“构造函数初始化器”可以实现。

3、 只读字段(readonly):只读字段比常量灵活的多,常量(const)字段必须在声明之初就初始化,但readonly字段甚至可以进行一些运算再确定其值。

注意:可以在够造函数中对只读字段赋值,但不能在其他地方赋值。

 

四、1、结构:结构和类几乎是一样的,在定义的时候只需要把class写成struct

       注意:结构是值类型,而类是引用类型;结构不支持继承;结构在编译时,编译器总会提供一个无参的构造函数;在结构中不允许定义无参的构造函数。

2、 部分类:我们可能把同一个类、接口或者结构放在不同的文件中,只需要在类、接口、结构前面加上partial关键字。

3、 Object类:所有的.NET类都派生于System.Object。既然都派生自System.Object,这样它的一些特定的方法我们就可以直接使用。比如最常用的ToString()方法。

 

五、继承:

       1、实现继承:表示一个类派生于一个基类型,并拥有该基类型的所有成员字段和函数。

       虚方法:把一个基类中的方法声明为virtual,则该函数可以在任何派生类中重写了。

       C#中,函数默认情况下不是虚拟的,需要显式的声明;但在Java中所有函数都是虚拟的。C#中,派生类的函数重写另一个函数时,要使用override关键字显式的声明。如果声明了override函数,但在基类中如果没有可以重写的函数,编译器就会报错了。

       注意,成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。

       调用函数的基本版本:base就是调用基类的意思

       抽象类和抽象方法:C#允许把类声明为abstract,抽象类不能实例化。

       密封类和密封方法:如果把类声明为sealed则表明该类不可以被继承,如果是方法,则方法不可以被重写。

       派生类的构造方法:在派生类中,构造方法是依次从基类执行,最后到派生类本身的构造函数。

 

       2、接口继承(interface):表示一个类型只继承了函数的签名,没有实现任何代码。在需要指定该类型具有某些可用的特性时,最好使用这种继承。

       接口的命名传统上都是以大写“I”开头。

       实现接口的类,必须实现类的全部成员,否则报错。

       注意:结构总是派生于System.ValueType,还可以派生于任意多个接口。

       把引用变量声明为接口类型的引用方式,这表明,他们可以指向实现这个接口的任何类的实例。

       接口也可以彼此继承,但要注意,实现接口的类必须实现接口以及接口的父接口的所有方法。

 

六、类型强制转换,拆箱,装箱

       装箱就是将值类型转换为引用类型,拆箱就是将引用类型转换为值类型。比如我们常用的.ToString()方法,就是典型的一个装箱的过程。

       对象的相等比较:

1、 ReferenceEquals()该方法是一个静态方法,用来判断两个引用是否指向同一个实例。也就是是否指向同一个内存地址,如果是则返回true,否则返回false

2、 虚拟的Equals()方法。因为是虚拟的方法,所以可以重写。这样它既可以用来比较对象,也可以比较值。

3、 静态的Equals()方法,这与虚拟的Equals()方法作用相同,只是带有两个参数,并对其进行比较。这个方法可以处理两个对象中有一个是null的情况,当有一个是null时,就会抛出异常。

4、 比较运算符== 我们最好把这种方法看作是严格值比较与严格引用比较之间的中间选项。但注意,通过这样的方式比较字符串的时候不是引用。

 

七、委托(delegate

       当我们需要把方法作为参数传递给其他方法的时候,就需要使用委托。

Public delegatestring GetAString(); 就是声明了一个委托(delegate),其语法和方法的定义类似,只是没有方法体,前面要加上关键字delegate

       注意,在C#中,委托总是自带一个有参的构造函数,这就是为什么在GetAString firstString = new GetAString(x.ToString); 中,通过这一句话初始化一个新的delegate时,传递了一个x.ToString方法。但,在定义delegate的时候,却没有定义参数。

 

八、C#数据结构,集合

       .NET中,对于数据结构的支持,即把许多类似的对象组合起来。最简单的数据结构就是数组。

       集合表示一组可以通过遍历每个元素来访问的一组对象,特别是可以使用foreach循环来访问它们。使用foreach循环是集合的主要目的,集合没有提供其他特性。

       数组列表:

数组列表类似数组,但数组列表是可以增大的。

比如 ArrayListarrayListTest = new ArrayList(10); 该句创建一个大小为10ArrayList对象,当我们再为其添加第11项时,其容量会自动扩大一倍,变成20,而原来的对象会被添加上垃圾收集器的标记。