方正阿帕比的笔经-C#基础概念
总结总结再总结
突然发现很多东西看过一遍后其实没有印象,必须总结总结再总结:
1 C#中 属于引用类型的是?A
A string B double C int D enum
说明:string 是引用类型,不是值类型
值类型:
单元直接存放“有效值”
如:
int a=3;
则a内存单元就放的是3
引用类型:
单元放的是另外一个对象的引用(地址)
如:
Form form1=new Form();
就是说,在内存中开辟了一个对象new Form(),form1内存单元存放的是那个对象的地址,并非对象本身
2 C#的语句输出结果
Double myVal=0.2;
Console.WriteLine("{0:#%}",myVal) ; B吧。。没啥说的
A 0.2% B 20% C {0:#%} D #%
3关于结构和类,说法正确的是:A
A 结构的成员默认public 类的成员默认private;
B 结构和类都是引用类型;
C 结构不能实现接口,类可以;
D 结构和类的静态属性都可以初始化;
说明:结构的成员默认public 类的成员默认private
结构是值类型,类是引用类型
结构体与类都能够实现接口
如图
值类型
C#的所有值类型均隐式派生自System.ValueType:
* 结构体:struct(直接派生于System.ValueType);
o 数值类型:
+ 整型:sbyte(System.SByte的别名),short(System.Int16),int(System.Int32),long(System.Int64),byte(System.Byte),ushort(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char(System.Char);
+ 浮点型:float(System.Single),double(System.Double);
+ 用于财务计算的高精度decimal型:decimal(System.Decimal)。
o bool型:bool(System.Boolean的别名);
o 用户定义的结构体(派生于System.ValueType)。
* 枚举:enum(派生于System.Enum);
* 可空类型(派生于System.Nullable<T>泛型结构体,T?实际上是System.Nullable<T>的别名)。
引用类型
C#有以下一些引用类型:
* 数组(派生于System.Array)
* 用户用定义的以下类型:
o 类:class(派生于System.Object);
o 接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders在《C# Programming Language》中说,接口只是表示一种约定[contract]);
o 委托:delegate(派生于System.Delegate)。
* object(System.Object的别名);
* 字符串:string(System.String的别名)。
可以看出:
* 引用类型与值类型相同的是,结构体也可以实现接口;
* 引用类型可以派生出新的类型,而值类型不能;
* 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);
* 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
结构和类的静态属性哪个可以初始化?这个始终不懂,望高人指点。
在C#中类和结构的区别
1. 值类型与引用类型
(1)结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,
通过使用结构可以创建更多的值类型
(2)类是引用类型:引用类型在堆上分配地址,堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某商业逻辑。因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:
a.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
b.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,
且对象不可用
2.继承性
(1)结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
(2)类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
3.内部结构:
(1)结构:
没有默认的构造函数,但是可以添加构造函数
没有析构函数 没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符 可以不使用new 初始化 在结构中初始化实例字段是错误的
(2)类:
有默认的构造函数 有析构函数 可以使用 abstract 和 sealed 有protected 修饰符 必须使用new 初始化
4.如何选择结构还是类
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。 3. 在表现抽象和多级别的对象层次时,类是最好的选择 4. 大多数情况下该类型只是一些数据时,结构时最佳的选择
4 那个关于接口的描述是错误的 选A
接口包含方法和属性,但不包含事件;
接口不包含方法的实现;
一个类可以实现多个接口;
继承接口的任何非抽象类型都必须实现接口的所有成员;
说明:接口包含方法和属性,也包含事件
接口具有下列属性:
-
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
-
不能直接实例化接口。
-
接口可以包含事件、索引器、方法和属性。
-
接口不包含方法的实现。
-
类和结构可从多个接口继承。
-
接口自身可从多个接口继承。
5 那些运算符属于右结合?选C吧 没啥说的
位移运算符 《 》
一元运算符++
元运算符new
赋值运算符;
6 下面哪个说法错误?选B
类不可以多重继承 接口可以
一个类可以有多个基类和多个基接口
抽象类自身可以定义成员接口不可以
抽象类和接口都不可以实例化
说明:一个类只能有一个基类和多个基接口
就先整理到这里,明天继续。。