C#中一个参数的类型有值类型与引用类型,像int、bool、double、decimal、char、struct、enum等是属于值类型,而像string、自定义类、数组等是属于引用类型
(1)值类型继承自System.valueType,而引用类型继承自System.Object。
(2)值类型的长度是固定的,引用类型的长度是可变的,并且值类型的值不能为null,如果要将值类型的值赋值为null,就要将值类型定义为可空的类型 int? a=null;
(3)在储上值类型存储在栈中,而引用引用类型存储在堆中,引用类型同样在栈中开辟了空间,用来存放指向堆中的地址
//定义一个Person类 public class Person { public string Name{get;set;} public int Age{get;set;} }
public void Fun() { Person p=new person(); p.name="11"; Person p1=p;//把p在栈中开辟的地址复制给p1,这样p1就指向p在堆中开辟的空间 p1.name="22"; console.writeline(p.name)//输出的结果是"22"; };
Person p1=p是把p在栈中开辟的地址假设为0x0001,这个地址指向的是p在堆中开辟的一块空间,赋值给了p1,这样p1的地址也就为0x0001,这样p1就指向了0x0001这个地址指向的空间
而引用类型中string作为一个特殊的存在,具有不可变性的特点
string str1 = "aa!";
string str2 = "bb";
string str3 = str2;
Console.WriteLine("{0}
{1}
{2}", str1, str2,str3);
//输出的结果是 aa bb bb