Sau*_*jan 7 c# pass-by-reference
今天我学习了价值类型和参考类型.
我在下面的代码示例中有一个疑问:
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
FunctionSB(sb);
Console.WriteLine(sb); //sb updated
customer c = new customer();
FunctionClass(c);
Console.WriteLine(c.s);//updated class value
String str = "";
FuntionString(str);
Console.WriteLine(str);//
}
private static void FunctionSB(StringBuilder sb)
{
sb.Append("sb updated");
}
private static void FunctionClass(customer c)
{
c.s = "updated class value ";
}
static void FuntionString(String str)
{
str = "updated value";
}
}
class customer
{
public string s;
}
Run Code Online (Sandbox Code Playgroud)
这里更新字符串构建器值和类成员变量值,但为什么FuntionString(str);不更新str值?(为什么不作为参考传递?)
我很重要的是区分变量和对象.
考虑一下代码:
String str = "";
FuntionString(str);
Run Code Online (Sandbox Code Playgroud)
str是一个变量.首先,该变量的值是对字符串的引用.假设该引用是数字246.字符串246可以被解析为一个值; 它的值是一个空字符数组.
然后我们将该变量的值传递给FuntionString.我们没有传递对str变量的引用,我们只是传递数字246.它是该引用或数字的副本.
在该函数内部,它有一个完全不同的变量,恰好也被调用str.标识符相同的事实不会改变它恰好具有相同值的不同变量这一事实.
当您更改str 变量里面FuntionString你就不会改变str从变量Main.在FuntionString完成后,strfrom Main仍然保持在引用246上,就像之前一样,并且str内部的变量FuntionString具有一些新引用的值,假设为3,带有值的字符串新字符串"updated value".变量的变化没有反映出来Main.
在FunctionSB实现该方法的情况下实际上并没有改变sb变量.它不是改变变量,而是改变变量引用的对象.在这种情况下sb指向某个位置的对象,比方说39. sb主方法和另一个方法中的两个不同的变量带有相同引用的副本.该方法不会更改sb变量,而是更改位置39处的sb对象.他们俩sb对象仍然具有相同的值; 它们没有变化,但它们都"指向"一个已经改变的单个对象.因此,可以从中观察到用该方法进行的突变Main.
如果从FuntionString您的定义中更改了两个变量所指向的字符串对象,而不是更改变量本身,那么更改将是来自调用者的"可观察".当然,这是不可能的,因为字符串是不可变的.该方法无法以调用者可以观察到的方式改变对象.