最近因为Unity,所以较详细的看了一遍原版的《Thingking in C#》,对于一些容易和c++混淆的地方,做下记录:
1.Object type和value type:
1.1Object 在c#里面主要有两种大的数据类型,一种叫做Object,c#里面的所有的自定义class都继承自这个类型,所有的Object实际上都是一个reference,指向某个内存(包括数组,string类型)。Object必须通过new来早堆上分配分配(string 可以直接用引号)。
1.2value :int float char enum struct 这些类型是value type,是再栈上分配的,不用new,是声明就有值的,握着的不是指针。
对于赋值操作,value type是拷贝传值 object只是传递引用
1.3boxing 和unboxing操作,将value 类型转换为Object 类型是可以的,这个操作叫boxing,有性能损失,但是这是C#统一所有类型的方法
1.4c#永远不再static内存上分配数据,但是有static关键字
1.5.生存周期,value type出了作用域就销毁了,Object 类型默认要等待gc
1.6struct是不能有继承的
2.可以如下定义枚举类型,是只支持逻辑操作
[Flags]
enum Flavor{
Vanilla = 1, Chocolate = 2,
Strawberry = 4, Coffee = 8}
Flavor conePref = Flavor.Vanilla | Flavor.Coffee;
3.namespace可以嵌套
namespace ThinkingIn{
namespace CSharp{
namespace Chap3{
//class and other type declarations go here
}
}
}
namespace ThinkingIn.CSharp.Chap4{ … }
4.数组类型
c对于多维数组c#有两种数组类型:
rectangular array
string[,] names;
int[,,] buttons = new int[4,5,3];
即矩形的数组
jagged array
非矩形
byte[][] scores;
混合矩形和非矩形
int[][,,][,] numbers;
矩形数组的性能要更好
5.访问属性
privae internal(package内部是friendly的) protected public
class 只能是internal或者public
默认属性:class mem(private)
class(internal)
6.对于那些不希望让c#管理资源的对象(自动的gc),通常是一些珍贵的资源,或者是一些你需要明确知道他析构的对象,需要继承Idsiposal接口,自己释放
http://dearymz.blog.163.com/blog/static/20565742009102745358396/
7.const 与readonly
c#的const 和c++完全不同,它是编译器常量,即在编译后会把const的地方自动用值替换(很像c++的宏),类中的const自带static,const只能修饰value type(编译器常量)
readonly 更像c++里面的const,是运行期的常量,对于object type,只是引用不可变,但是引用的那个对象是可变的
8.sealed class:不能被继承的class,所有的virtual 函数会被替换成可直接调用
9.as 操作符:类型转换 is 操作符,判断是否为某个类型
10.接口是可以被继承的
11.反射机制
http://www.dotnetperls.com/reflection
12.讲更多c#技术的书