文档介绍:该【C基础知识点(附答案) 】是由【莫比乌斯】上传分享,文档一共【12】页,该文档可以免费在线阅读,需要了解更多关于【C基础知识点(附答案) 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。C#基础知识点
先是将对象抽出来,构造成一个仿真的环境,然后在这个环境里,把与最终要解决的问题间建立一个方法。 
封装就是用一个框架把数据和代码组合在一起,形成一个对象。遵循面向对象数据抽象的要求,一般数据都被封装起来,也就是外部不能直接访问对象的数据,外部能见到的只有提供给外面访问的公共操作(也称接口,对象之间联系的渠道)。在C#中,类是支持对象封装的工具,对象则是封装的基本单元。 
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。使用继承而产生的类被称为派生类或者子类,而被继承的类则称为基类、超类或父类。 
多态也是面向对象语言的基本特征之一,是指在程序执行之前无法根据函数名和参数确定调用哪一个操作,而是程序执行过程中,根据实际运行情况动态确定,从而带来编程高度的灵活性。实现多态的方法是使用虚方法。Virtual
值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等。
栈是操作系统分配的一个连续的内存区域,用于快速访问数据。因为值类型的容量是已知的,因此它可存储在栈上。而托管堆是CLR在应用程序启动时为应用程序预留的一块连续内存区,是用于动态内存分配的内存区,引用类型的容量只有到运行时才能确定,所有用堆来存储引用类型。
作为运算符可以创建对象和调用构造函数;
例:Class_TestMyClass=newClass_Test();
例:intmyInt=newint();
作为修饰符可以用于向基类成员隐藏继承成员,实现派生类中隐藏基类的virtual方法,不能和override共存;
作为约束可以在泛型声明中约束可能用作类型参数的参数类型。
集合
。
集合类:
ArrayList:使用大小可按需动态增加的数组实现IList接口。
BitArray:管理值的压缩数组,该值表示为布尔值,true表示位是打开的(1),false表示位是关闭的(0)。
CaseInsensitiveComparer:比较两个对象是否相等,比较时忽略字符串的大小写。
CollectionBase:为强类型集合提供abstract基类。
Comparer:比较两个对象是否相等,其中字符串比较是区分大小写的。
DictionaryBase:为键/值对的强类型集合提供abstract基类
Hashtable:表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。
Queue:表示对象的先进先出集合
ReadOnlyCollectionBase:为强类型非泛型只读集合提供abstract基类。
SortedList:表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
Stack:表示对象的简单的后进先出非泛型集合。
C#运算符(is/as)
1、类型检查的效率不一样:
is需要做两次对象的类型检查,而as需要做一次对象类型检查,再加一次null的检查。
2、is的检查规律:
A:检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,如果是目标类型或是其父类型的话就返回为true,否为false。永远不会抛出异常
B:如果对象引用为null,则返回为false,因为没有对象可以检查其类型。
3、as的检查规律:
A:检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null;
B:不会抛出异常;
C:如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常;
D:用as来进行类型转换的时候,必须是目标类型或者转换目标类型的派生类
4、as运算符只执行引用转换和装箱转换;is运算符只考虑引用转换、装箱转换和取消装箱转换。
5、使用as操作符有如下几点限制
A:不用在类型之间进行类型转化
B:不能应用在值类型数据
#的特点
简洁的语法、面向对象设计、与Web的紧密结合、
完整的安全性与错误处理、版本处理技术、灵活性与兼容性。
#有几种声明关键字?
public,字段、属性和方法均为公开的,不仅类中的其它成员能访问到,还可以通过类的实例访问的到。
private,字段、属性和方法均为私有的,只能被类中的其它成员访问到,不能通过类的实例访问。
protected,包含private特性,而且protected修饰的字段、属性和方法能被子类访问到。
internal,在同一个程序集中和public一样,但是不能被其它程序集访问,而且子类的话,只能被同一个命名空间的子类访问到。
Sealed,密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。
="chain";
intstrLength=;
=(0,2)
(起始位置,截取位数);
="hello";
str=();
:(str1,str2)stringstr="你好";
str=("你","他");
属性和变量的区别
属性与成员变量类似,它们都提供数据存储,但属性的功能远比成员变量强大。属性由特殊方法(Get和Set访问器)访问。Get和Set访问器允许在设置或检索属性之后验证属性值、执行其他代码或执行其他任务。
static的作用,用法
static意思是静态,可以修饰类、字段、属性、方法。标记为static的就不用创建实例对象调用了,可以通过类名直接点出来。
static三种用法:
,表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值,这个方法称为静态函数:
privatevoids(){staticinta=1;a++;}
方法第一次调用结束后a在内存内值为2;
方法第二次调用结束后a在内存内值为3;
(函数)前用static修饰,表示此方法为所在类或所在自定义类所有,而不是这个类的实例所有,这个方法称为静态方法。
,说明此类型无法新建实例,简单点说这个类型的方法全是静态方法,这个类里的非静态方法是不能使用的,这个类型称为静态类.
比如C#控制台操作的Cancle类里面的成员就被标记为静态的,。
如果没有标记为静态就要通过创建实例对象来调用,比如说动态字符串StringBuilder就要new一个实例来调用。
ref和out
1、ref传进去的参数必须在调用前初始化,out不必,
2、ref传进去的参数在函数内部可以直接使用,而out不可
3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。
装箱拆箱
装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型
利用装箱和拆箱功能,可通过允许值类型的任何值与Object类型的值相互转换,将值类型与引用类型链接起来
例如:
intval=100;
objectobj=val;
(“对象的值={0}",obj);
这是一个装箱的过程,是将值类型转换为引用类型的过程
intval=100;
objectobj=val;
intnum=(int)obj;
("num:{0}",num);
这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程。
泛型
在泛型类型或泛型方法的定义中,类型参数是一个占位符(placeholder),通常为一个大写字母,如T。在客户代码声明、实例化该类型的变量时,把T替换为客户代码所指定的数据类型。泛型类,如泛型概述中给出的MyList<T>类,不能用作as-is,原因在于它不是一个真正的类型,而更像是一个类型的蓝图。要使用MyList<T>,客户代码必须在尖括号内指定一个类型参数,来声明并实例化一个已构造类型(constructedtype)。这个特定类的类型参数可以是编译器识别的任何类型。可以创建任意数量的已构造类型实例,每个使用不同的类型参数,如下:
MyList<MyClass>list1=newMyList<MyClass>();
MyList<float>list2=newMyList<float>();
MyList<SomeStruct>list3=newMyList<SomeStruct>();
C#回收机制
对象的生命周期:计算对象大小——查找可用内存——初始化对象——使用对象——摧毁对象。CLR会在合适的时候进行执行垃圾回收来释放不再使用的内存。
“重载”与“重写”有什么区别
overload:重载就是在同一个类中,方法名相同,参数列表不同。参数列表不同包括:参数的个数不同,参数类型不同等。
override:说的是两个类继承,子类重写父类的方法,在调用的时候,子类的方法会覆盖父类的方法,也就是会调用子类的方法。在父类中的方法必须有修饰符virtual,而在子类的方法中必须指明override。(方法名称必须相同,参数也要相同)
重写格式:
父类中:publicvirtualvoidMethod(){}
子类中:publicoverridevoidMethod(){}
重写以后,用父类对象和子类对象访问Method()方法,结果都是访问在子类中重新定义的方法,父类的方法相当于被覆盖掉了。子类中为满足自己的需要来重复定义某个方法的不同实现。
重写是发生在父类与子类之间的关系。具体来讲就是子类可以重写父类的现有的方法。它要求子类的方法名称及参数必须与父类完全一致。比如吃饭,父亲可以吃两碗面,孩子同样也是吃面,却只能吃一碗。
重载则主要是发生在同一个类当中的,它通过多个名称相同的方法,但方法参数不相同,或者方法返回类型不相同来加以区别。其中,方法参数不相同包括以下几种情况:参数的个数不相同,参数的类型不相同,参数的对应位置不相同。需要说明的是,重载同样可以应用到父类与子类当中。即子类重载了父类的方法。
理解委托
委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联,可以通过委托调用方法。委托用于将方法作为参数传递给其他方法。时间处理程序就是通过委托调用的方法。
数据字典/ArrayList
ArrayList是一种动态数组,,它提供了动态的增加和减少元素,实现了ICollection和IList接口。
关于AppDomain的作用,说几个常用的就行了
AppDomain是什么:当一个程序集被执行时,系统就会自动为其创建一个AppDomain,每一个AppDomain属于某个进程,一个进程内可以有多个AppDomain;每个AppDomain创建时都有个默认的名称,该名称就是加载的程序集的名称()。
同一windows进程内的不同AppDomian之间可以互相共享资源,如:CLR,,地址空间及线程。
程序集在AppDomain中的调用:在同一进程内,如果不同的AppDomain调用同一Assembly会有以下两种情况:
1、会在每个AppDomain中加载该Assembly并为各AppDomain所调用;
2、会在该进程内,不在任何的AppDomain中单据加载该Assembly,然后同一进程内的所有AppDomain都可以对其进行调用。这种方式加载的程序集(Assembly)称为域无关(DomainNeutral)的。
AppDomain和线程的关系式正交的;n<--->n的关系。
注意当AppDomain加载了某个Assembly后就无法将其单独卸载,不过可以讲AppDomain卸载掉。
卸载AppDomain时CLR会卸载当前在该AppDomain执行的所有线程,如果此时在执行非托管代码就可能产生问题,并且改AppDomain中所有的托管对象也会被垃圾回收器强制回收;
AppDomain的孤立性:
1)、一个AppDomain可以独立于其他的AppDomain被卸载掉;
2)、一个AppDomain不能放问其他AppDomain内的Assembly和对象;
3)、若没有发生跨边界的异常抛出,一个AppDomain拥有自己独立的异常管理策略。这也就意味着同一进程内的某一AppDomain发生异常不会影响到其他的AppDomain。
4)、每个AppDomain可以定义独自的程序集代码访问安全策略;
5)、每个AppDomain可以定义独自的规则,以便在CLR加载前定位程序集的位置
=""和stringstr=null有什么区别?
string str = null 是将null赋给栈中的指针(是一个空指针),指向的堆不分配内存空间,而string str = "" 是给它栈中赋一个指针,指向堆里的一个空内存空间。
、接口的理解,你用过没有?在哪用的?
相同点:
(1)都可以被继承
(2)都不能被实例化
(3)都可以包含方法声明
(4)派生类必须实现未实现的方法
区别:
(1)抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
(2)抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”
(3)接口可以被多重实现,抽象类只能被单一继承
(4)抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
(5)抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;
接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性
(6)接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法
(7)接口可以用于支持回调,而继承并不具备这个特点