标签:
和javascript等脚本语言不同,C#基本上可以说是强类型的编程语言。这意味着,任何变量在编译时(而不是运行时)就必须要有一个类型。直到c#4.0,引入了动态类型为止。c#的弱类型体现在其类型object中。任何变量都可以是object类型的,也就是说他们在编译时没有类型,肯定能通过编译。但错误将会在运行时才发生。
强类型的好处有很多,例如可以保证类型安全(否则将会发生运行时错误),可以享受IDE带来的智能提示等,不容易出错(出错可以在编译的时候就知道)。c#有很多数据类型,而他们可以分为两类:ValueType(值类型)和ReferenceType(引用类型)。前者包括int, double, long等等那些数值类型,bool,结构体和枚举。后者则比较抽象,包括类,接口,委托,数组,字符串等。搞清楚两大类数据类型的特性非常重要,这也是一个面试基础题目:
int i=0; int j=i;
此时如果改变i的值,j的值将不受影响。但如果i是一个引用类型,则j=i意味着i和j的指针指向相同的地方。所以改变任何一个的值,另一个也会受到影响。这种行为称之为浅复制,即仅仅在栈上复制一个引用,而指针则仍然指向相同的地方(即堆上仍然是只有一个对象但是现在两个引用指向它)。如果要在堆上开辟一个新的对象,则要使用深复制,其方法为实现ICloneable接口。引用类型浅复制的行为是默认的,即使是一个较复杂的值类型,其中包含引用类型(例如你可以写一个包含类的结构体),其行为也是一样。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 rectangle a = new rectangle("info", 10, 20); 6 rectangle b = a; 7 a._chang = 999; 8 a._recinfo.infostring = "new info"; 9 10 Console.WriteLine(string.Format("A: chang is {0} and kuan is {1}, info: {2}", a._chang, a._kuan, a._recinfo.infostring)); 11 Console.WriteLine(string.Format("B: chang is {0} and kuan is {1}, info: {2}", b._chang, b._kuan, b._recinfo.infostring)); 12 Console.ReadKey(); 13 } 14 } 15 16 struct rectangle 17 { 18 public shapeinfo _recinfo; 19 public double _chang; 20 public double _kuan; 21 22 public rectangle(string recinfo, double chang, double kuan) 23 { 24 _recinfo = new shapeinfo(recinfo); 25 _chang = chang; 26 _kuan = kuan; 27 } 28 } 29 30 class shapeinfo 31 { 32 public string infostring; 33 34 public shapeinfo(string s) 35 { 36 infostring = s; 37 }
运行代码可以看到两个结构体的shapeinfo的值都变了,而其属于值类型的那两个double则是互相不受影响。
标签:
原文地址:http://www.cnblogs.com/haoyifei/p/4188672.html