C#小知识点总结(1)
1,静态成员和非静态成员的区别?
(1)静态成员使用static修饰符进行声明;在类被实例化时被创建;属于类本身;只能通过类名进行访问(网上有的地方说可以通过实例访问,经我验证,C#中不可以)。
(2)不带static修饰符声明的为非静态成员;在对象被实例化时被创建;属于实例本身;只能通过实例进行访问。
2,const 和static readonly的区别?
(1)用const修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序。
(2)用static readonly修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问;初始化以后不可修改。但与变量不同的是这种变量是在运行期初始化。
3,sealed修饰符的作用?
(1)sealed修饰符表示密封。
(2)用于类时,表示该类不能再被继承,不能和abstract同时使用。因为这两个修饰符在含义上互相排斥。
(3)用于方法和属性时,表示该方法或属性不能再被重写,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员。
(3)通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类,以防止滥用继承造成层次结构体系混乱。
类B在继承类A时可以重写两个虚函数。但类B对F方法进行了密封,类C在继承类B时只能重写一个函数。所以输出时,类C的方法F只能输出类B中对该方法的实现。
4,override和overload的区别?
(1)override表示重写,用于继承类对基类中虚成员的实现。
(2)overload表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现(仅返回值不同不可以)。
5,new修饰符的作用
(1)new修饰符和new操作符是两个概念。
(2)new修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。所以new修饰符只能用于继承类,一般用于弥补基类设计的不足。new修饰符合override修饰符不可同时用在一个成员上,因为两个修饰符在含义上是互斥的。
(3)new操作符用于实例化一个类型。
6, this 关键字的含义?
(1)this是一个保留字,仅限于在构造函数和方法成员中使用。
(2)在类的构造函数中出现表示对正在构造的对象本身的引用;在类的方法中出现表示对调用该方法对象的引用;在结构的构造函数中出现表示对正在构造的结构的引用;在结构的方法中出现表示对调用该方法的结果的调用。
(3)this保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化。
(4)在C#系统中,this实际上是一个常量,所以不能使用this++这样的运算符。
(5)this保留字一般用于限定同名的隐藏成员、将对象本身作为参数、什么索引访问器、判断传入参数的对象是否为本身。
7,可以使用抽象函数重写基类中的虚函数吗?
(1)可以。
(2)需使用new修饰符显示声明,表示隐藏了基类中该函数的实现。
(3)或增加override修饰符,表示抽象重写了基类中该函数的实现。
8,接口可以包含哪些成员?
(1)可以包含属性、方法、索引指示器和事件。
(2)但不能包含常量、字段、域、操作符、构造函数和析构函数。也不能包含任何静态成员。
9,类和结构的区别
(1)类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存。类有构造和析构函数。类可以继承和被继承。
(2)结构:结构是值类型在栈上分配(虽然栈的访问速度比堆要快,但栈的资源有限),结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数。结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口。
(3)所以,一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象的最好实用类。
10,接口的多继承会带来什么问题?
C#中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的函数,就产生了二义性(这也是C#中类取消了多继承的原因之一)。这时在实现时最好显示的声明。
11,抽象类和接口的区别?
(1)抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义。
(2)抽象类是从一系列相关对象中抽象出来的概念,因此反映的是实物的内部共性。接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性。
12,如何理解C#中的委托?
C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象、类型安全的。