误区1:引用类型保存在堆上,值类型保存在栈上
第一部分是正确的的,引用类型的实例总是在堆上创建的。但第二部分就有问题了。变量的值是在它声明的位置存储的。所以,假定一个类有一个int类型的实例变量,那么这个类的任何对象中,该变量的值总是和对象中的其他数据存放在一起的,也就是堆上。
只有局部变量(方法内部声明的变量)和方法参数在栈上。对于C#2及更高版本,很多局部变量并不完全存放在栈中。(后续补充。。。)
误区2: 对象在C#中默认是通过引用传递的
目前个人理解是不管值类型还是引用类型传递的都是声明的变量的地址值,上代码比较直观一些
图片为个人理解,如有错误还请指正
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
sb.Append("GYY");
foo(sb);
Console.WriteLine(sb.ToString()); //输出:GYY你好
foo1(sb);
Console.WriteLine(sb.ToString());//输出:GYY你好
foo2(ref sb);
Console.WriteLine(sb.ToString());//输出:GGG
Console.ReadKey();
int x = 1;
voo(x);
Console.WriteLine(x);//输出:1
voo(ref x);
Console.WriteLine(x);//输出:10
Console.ReadKey();
}
static void foo(StringBuilder s)
{
s.Append("你好");
}
static void foo1(StringBuilder s)
{
s = new StringBuilder();
s.Append("GGG");
}
static void foo2(ref StringBuilder s)
{
s = new StringBuilder();
s.Append("GGG");
}
static void voo(int x)
{
x = 5;
}
static void voo(ref int x)
{
x = 10;
}