1、关键词意义解释:public、 internal、protected、private、sealed、get、set、readonly、const、static、override、 constructor、destructor、Garbage Collector、CLR
1.public:访问权限修饰符,同一程序集或者引用该程序集的其他程序集都可以访问
2.internal:访问权限修饰符,只能在同一程序集访问类
3.protected:访问权限修饰符,只能在同一个类或者派生类中访问
4.private:访问权限修饰符,只能在同一个类中访问
5.sealed:修饰符表示密封,用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥用于方法和属性时,表示该方法或属性不能再被重写,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员
6.get:返回属性类型的值,相当于读取字段的值
7.set:给字段赋值
8.readonly:用来定义字段,表示字段是只读的,可以再定义里初始化也可以在构造函数里初始化。
9.const:用来定义字段,表示字段是常量不能修改,只能在定义时初始化。
10.static:用来声明静态方法,或静态字段。 静态是属于类的,而非静态是属于对象的;1、static变量及方法不用实例化对象就可以用类名.静态变量和类名.静态方法这种方式进行访问,这使得访问更加方便,不用手工实例化对象。对于某些只读变量和方法来说很适合共享。2、static与非static最大的区别就是static类型的变量及方法在调用的时候就在内存中分配了地址,且这个地址只有一份,故static可以直接访问。而非static必需手工去实例化该类,以对象的方式去访问变量和方法。3、在一个静态方法里去访问该类的非静态变量或方法,由于static是属于类本身的,是在类被调用的时候,static类型就已经生成,而非static此时并没有生成,它不属于这个类本身,它是属于这个类的对象。故在没有实例化成对象的时候,在静态方法中访问非静态是根本找不到它们的,它不属于这个类。4、在非静态方法中去访问静态,由于类被调用时,静态变量和方法就已经生成,也就是说它们属于这个类。既然已经存在,故不管是在静态方法中,还是非静态方法中都可以访问到它们。5、this表明对象本身,而在静态方法中并没有对象概念存在,它只有类本身这个概念,它和对象是属于两种互拆的状态,即我中无你,你中无我的情况。也就是说你用对象名.静态变量或对象名.静态方法是不可访问的。6、每个类都必须有构造函数,否则此类无法实例化成对象。而我们有时定义的类可以不写它的构造函数,这是因为编译器会帮我们加上一个静态的空构造函数。这样才能实例化。也可以用静态构造函数去初始化静态变量。
11.override:重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。
12.constructor:构造函数没有返回值(void也不需要);如果一个类中可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,这称作构造函数的重载构造函数的命名必须和类名完全相同调用子类的构造函数时会先调用父类的无参构造函数;通常使用构造函数进行类中字段的赋初值;构造函数不能被直接调用,必须通过new关键字在创建对象时才会被自动调用;当一个类中定义了一个无参的构造函数,那么会自动覆盖系统自动生成的无参构造函数
13.destructor:析构函数是以“~”开头的,析构函数没有返回值,后紧跟类名,无参数;析构函数只能在类中使用,而且只能有一个析构函数;不能继承或重载析构函数;不能在代码中去调用析构函数,他是在资源被销毁时由运行时库调用的,同时会调用Object类的Finalize方法。
14.Garbage Collector:垃圾收集器,以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。1、提高了软件开发的抽象度; 2、程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题; 3、可以使模块的接口更加的清晰,减小模块间的偶合; 4、大大减少了内存人为管理不当所带来的Bug; 5、使内存管理更加高效。 总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。
15.CLR: CLR是一个公共语言运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等。可以被很多属于微软系列的开发语言使用。
2、简述C#中类的访问修饰符有哪些?类成员访问修饰符有哪些?区分应用场景。
1.public:(类访问修饰符)访问权限修饰符,同一程序集或者引用该程序集的其他程序集都可以访问
2.internal:(类访问修饰符)访问权限修饰符,只能在同一程序集访问类
3.abstract或internal abstract:(类访问修饰符)只能在同一程序集访问类,该类不能被实例化只能被继承
4.public abstract:(类访问修饰符)同一程序集或者引用该程序集的其他程序集都可以访问类,不能被实例化只能被继承
5.sealed或者internal sealed:(类访问修饰符)只能在同一程序集访问类,该类不能被继承,只能被实例化
6.public sealed:(类访问修饰符)同一程序集或者引用该程序集的其他程序集都可以访问类,该类不能被继承,只能被实例化
3.protected:访问权限修饰符,只能在同一个类或者派生类中访问
4.private:访问权限修饰符,只能在同一个类中访问
5.protected internal:(类访问修饰符)
6.readonly:用来定义字段,表示字段是只读的,可以再定义里初始化也可以在构造函数里初始化。
7.const:用来定义字段,表示字段是常量不能修改,只能在定义时初始化。
3、简述C#中类的构造方法和析构方法的特点和作用。
constructor:构造函数没有返回值(void也不需要);如果一个类中可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,这称作构造函数的重载构造函数的命名必须和类名完全相同调用子类的构造函数时会先调用父类的无参构造函数;通常使用构造函数进行类中字段的赋初值;构造函数不能被直接调用,必须通过new关键字在创建对象时才会被自动调用;当一个类中定义了一个无参的构造函数,那么会自动覆盖系统自动生成的无参构造函数
destructor:析构函数是以“~”开头的,析构函数没有返回值,后紧跟类名,无参数;析构函数只能在类中使用,而且只能有一个析构函数;不能继承或重载析构函数;不能在代码中去调用析构函数,他是在资源被销毁时由运行时库调用的,同时会调用Object类的Finalize方法。
4、C#中类的字段和属性之间的关系?如何设置只读属性、只写属性、可读可写属性?
属性有get和set两个语句,get:返回属性类型的值,相当于读取字段的值,set:给字段赋值。为了防止外部对字段进行修改,所以对字段的赋值或读这个字段都是通过set和get实现的
当属性仅含有get访问器,或者set访问器为private级别时,这样的属性称之为只读属性;当属性仅包含set访问器,或者get访问器为private级别时,称之为只写属性。当属性同时包含get和set的时候被称为可读可写属性
5、简述和总结C#中的结构类型与类类型的区别。
二、编程学生管理系统:项目工程命名StudentManagement
1:定义一个学生类Student,包含以下字段:姓名(string),学号(int),身份证号(string),性别(string),家庭住址(string),考试成绩(double)。
设置只读属性:姓名,学号,身份证号,性别;可读可写属性家庭住址、考试成绩;
实现带参数构造方法、析构方法、成员方法:PrintStudent();
重写ToString方法
2:定义一个学生管理类StuManagement(要求使用单例实现),里面又一个学生的数组存储学生信息,以及静态成员字段studentsNumber
能实现以下功能:
通过单例创建学生管理容器实例对象。
添加学生(存储不够扩容),
删除学生(存储太多缩容),
查找学生(根据身份证号和学号查找两种方式),