C#你需要知道的16个基础概念

1.静态变量和非静态变量的区别

静态变量:静态变量使用 static 修饰符进行声明 ,在所属类被装载时创建,通过类进行访问,所属类的 所有实例的同一静态变量都是同一个值。 非静态变量:不带有static 修饰符声明的变量称做非静态变量,在类被实例化时创建,通过对象进行访 问,同一个类的不同实例的同一非静态变量可以是不同的值。

2.const和static readonly的区别

const:用const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序。 static readonly:用static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的 使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化。

3.extern是什么意思

extern:修饰符用于声明由程序集外部实现的成员函数,经常用于系统API函数的调用。 注意:和DllImport一起使用时要加上static修饰符,也可以用于对于同一程序集不同版本组件的 调用(用extern声明别名),不能与abstract修饰符同时使用。

4.abstract是什么意思

abstract修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员。 abstract不可以和 static 、virtual 、override 一起使用。 声明为abstract成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化, 通常用于强制继承类必须实现某一成员。

5.internal是什么意思

internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问, 接口的成员不能使用 internal 修饰符

6.sealed修饰符是干什么的?

sealed修饰符表示密封,用于类时,表示该类不能再被继承,不能和abstract同时使用, 因为这两个修饰符在含义上互相排斥,用于方法和属性时,表示该方法或属性不能再被继承, 必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员, 通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成 层次结构体系混乱。恰当的利用sealed修饰符也可以提高一定的运行效率。

7.override和overload有什么区别

override 表示重写,用于继承类对基类中虚成员的实现。 overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现。

8.什么是指引器?

实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的 参数类型不仅限于int,简单来说,其本质就是一个含参数属性。

9.new修饰符是起什么作用的?

new 修饰符与 new 操作符是两个概念。 new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型。 new 修饰符只能用于继承类,一般用于弥补基类设计的不足。 new 修饰符和override修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥。

10.this关键字的含义

this是一个保留字,仅限于构造函数和方法成员中使用。 在类的构造函数中出现表示对正在构造的对象本身的引用, 在类的方法中出现表示对调用该方法的对象的引用。 在结构的构造上函数中出现表示对正在构造的结构的引用, 在结构的方法中出现表示对调用该方法的结果的引用。 this保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化。 在C#系统中,this 实际上是一个常量,所以不能使用this++这样的运算。 this保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身。

11.可以使用抽象函数重写基类中的虚函数吗?

可以,但需使用new修饰符显式声明,表示隐藏了基类中该函数的实现。

12.密封类可以有虚函数吗?

可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数。

13.什么是属性访问器?

如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有get和set两个呢? 如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。 如果基类中有get和set两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器。

14.abstract,virtual,override。

abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用。

15.接口可以包含哪些成员?

接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员。

16.类和结构的区别

类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存, 类有构造和析构函数,类可以继承和被继承。 结构:结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放), 结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数, 结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口。

C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。 但如果两个父成员具有同名的成员,就产生了二义性(这也正是C#中类取消了多继承的原因之一),这时在实现时最好使用显式的声明。

抽象类(abstract class)可以包含功能定义和实现, 接口(interface)只能包含功能定义,抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的 内部共性,接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性,分析对象, 提炼内部共性形成抽象类,用以表示对象本质,即“是什么”,为外部提供调用或功能需要扩充时优先使用接口。

通过别名指示符我们可以为某个类型起一个别名,主要用于解决两个命名空间内有同名类型的冲突或 避免使用冗余的命名空间,别名指示符只在一个单元文件内起作用。

文章转自CSDN 博主 彖爻之辞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注