C#读书笔记

最近因为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#技术的书

http://csharpindepth.com/

上一篇:阿里云视觉智能开放平台--文字识别使用教程


下一篇:DataRabbit 轻量的数据访问框架(10) -- IPagerManager