根据值类型和引用类型的区别,当作为函数参数传递的时候.
值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的
而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了.
如下代码: public void Add(int x)
{
x += 10;
} public void Add(string str)
{
str = "新值";
} string a = "原值";
int b = 0;
Add(b);
Add(a);
Response.Write("a:" + a + "|b:" + b);
上面输出应该为: a:新值|b:0
但实际输出的是:a:原值|b:0这是为什么呢
值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的
而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了.
如下代码: public void Add(int x)
{
x += 10;
} public void Add(string str)
{
str = "新值";
} string a = "原值";
int b = 0;
Add(b);
Add(a);
Response.Write("a:" + a + "|b:" + b);
上面输出应该为: a:新值|b:0
但实际输出的是:a:原值|b:0这是为什么呢
这里传递是引用没错。str引用的是字符串"原值",而不是你的变量a
public void Add(ref string str)
这里的str引用的是你传递的变量a,而不是"原值"你明白了么?
string是比较特殊的,它在堆上有个拘留池,所有"...."的写法都是一个新的实例,除非内容相同。
用来 ref 关键字的话,Add(ref int b) 调用后,b的值也一样会变的,这样并没有解释到值类型和引用类型的区别
{
public string Name {get; set;}
}var s = new Student() { Name="原值" };void Modify(Student student)
{
student = new Student() { Name="新值" };
}但实际你想要void Modify(Student student)
{
student.Name = "新值";
}
而是自己创建了一个新的引用。在方法作用域内指向了一个新的地址。
并没有影响到方法外部的引用。
什么地方有误?请教str = "xxxx" 的确是指向了新的引用