我读过一篇文章http://www.albahari.com/valuevsreftypes.aspx
根据这一点,int
是值类型,form
是引用类型的示例。
Point myPoint = new Point (0, 0); // a new value-type variable
Form myForm = new Form(); // a new reference-type variable
string mystringval="test";
Test (myPoint, myForm); // Test is a method defined below
void Test (Point p, Form f)
{
p.X = 100; // No effect on MyPoint since p is a copy
f.Text = "Hello, World!"; // This will change myForm’s caption since
// myForm and f point to the same object
f = null; // No effect on myForm
}
因此,如果我将字符串值传递给函数测试,而不是表单变量myform
,它是否也会更改我已在外部声明的原始值?
将字符串保持为引用类型的好处是什么,如果无论如何将值保存在堆栈中并且只将引用存储在堆中?
答案 0 :(得分:4)
如果我将字符串值传递给函数测试,它是否也会更改我已经在外面声明的原始值?
不,myForm
的值也没有变化,myForm
变量仍指向/引用相同的Form
对象(通过new Form()
创建的对象)。< / p>
在Test
方法中,当您致电:
f.Text = "Hello, World!";
您没有更改变量f
,而是更改了f.Text
,这是另一种变体。
换句话说,您正在更改f
和myForm
引用的对象上的属性。但仍然f
和myForm
引用相同的原始对象。
请注意,当您将f
更改为null
时,变量myForm
未发生变化。现在,f
没有任何内容,但myForm
变量仍然引用原始对象。
如果要更改原始myForm
变量(使其指向/引用另一个Form
对象)或mystringval
(使其引用另一个字符串),则将它们传递给测试方法如下:
void Test (Point p, ref Form f)
{
...
}
void Test (Point p, ref string s)
{
...
}