最近在读金旭亮老师写的.net4.0面向对象编程漫谈,因为这本书的实验性不强,理论基础比较多,所以准备写一些学习笔记,来记录一下
1、 数值类型的使用
(1) 数值类型的转换
在c#中,数据类型像int、long等,由C#编译器映射到CLR能直接识别的System.Int32,System.Int64等
a、 当数据类型从“小到大”时可以自动转换,比如int类型转化为long类型
b、 当数据类型从“大到小”时需要强制转换才行。比如long转化为long类型
(2) “天文数字的计算”
在.net4.0中,为解决大整型数据,它提供了一个BigInterger,整个类型理论上可以计算无穷的的数据,但其实计算机内存和计算机计算能力的影响
2、引用类型的使用
在.net中引用类型共有以下四种:接口类型,类类型,数组类型和委托类型。
(1)线程堆栈和托管堆栈
每个程序运行时都会对应一个“进程”,在一个进程内部,可以有一个或者多个“线程”,每个线程都有一块内存“自留地”,成为“线程堆栈”,大小1MB,用来保存自己的数据
a、 对于值类型来说,值类型变量所占用的内存单元是在线程堆栈中分配
b、 对于引用类型来说引用类型所引用的对象所占的内存是在托管堆中分配的。
比如下面是一个Model类
Class Model
{
public int key;
public int[] num;
}
下面定义一个Model类型的实例
static void main(string[] args)
{
Model mod=new Model();//定义了一个Model的实例mod
}
下面是mod的内存模型
对于对象数组比如Model[] mod=new Model[10];,这个数组并不能直接赋值,需要先对每个对象初始化以后才能赋值。
3、 关于“=”和“==”
比如还是上面的类型我们创建两个变量并赋值
比如:
Static void main(string[] args)
{
Model mod1=new Mdeol();
Model mod2=null;
mod2=mo1; 引用类型的赋值运算
}
下面是引用类型的赋值运算后的内存模型图
对于“==”运算符的功能,它可以应用于值类型和引用类型的变量。它是用于判断两个变量是否相等。
对于引用类型“==”是判断两个引用类型的变量是否引用一个对象
4、 值类型的装箱和拆箱
比如:下面两句代码
Int num=123;
Object obj=I;
以上代码是一个装箱过程,内存模型如下
在装箱和拆箱过程中,它使我们把值类型转化为引用类型,但这个操作会带来性能问题,所以在编程过程中尽量减少这方面的操作。
5、 string类型的理解
1、 string不是值类型
2、 string变量的内容是只读的。(这个可能令人意外。)
3、 string类型的加法运算内幕
a、 当字符串类型与值类型相加时,会先创建一个匿名的object类型对象,将值类型数字放入此对象中,然后在调用一个string类型的静态方法Concat方法的重载形式。
b、 当字符串是引用类型相加时,会默认调用此变量所引用对象的ToString方法将此对象转化为一个字符串,然后再与原字符串相加得到一个新的字符串。
4、 string类型使用建议
a、 避免使用加法运算符连接不同类型的数据
b、 在循环中使用StringBuilder代替String实现字符串连接
本人表达能力不强,笔记中有什么不足之处望请指正。