我有两个类型为 string
和 SelectListItem
的变量,并尝试在我的代码中使用它们,我发现了一些奇怪的东西并寻找原因。
场景 1:
public class Test1
{
string x=""
void Assign(string x)
{
x="I am modified value";
}
public void myMethod()
{
Assign(x);
console.WriteLine(x) // output : ""
}
}
场景 2:
public class Test2
{
void Assign(SelectListItem x)
{
x.Text="Modified Text";
x.Value="Modified Value";
}
public void myMethod()
{
var x = new SelectListItem()
x.Text="present Text";
x.Value="present Value";
Assign(x);
console.WriteLine(x) // output : Text:"Modified Text" & Value:"Modified Value"
}
}
您可以在scenario1
中看到我的输出是""
甚至很难我之前在函数内分配x="I am modded value"
打印o/p,但在 scenario2
中,我得到修改值的输出 Text:"Modified Text"& Value:"Modified Value"
。
我真的找不到原因,只有我能想到的是在scenario2
中我们正在传递实例。因此,当我们自动修改时,更改就会生效,但我不确定这是否是其背后的真正原因,并且对scenario1
没有任何线索
最佳答案
引用类型也是按值传递的。当您传递引用类型变量时,它的引用值将被复制到参数中。分配新引用只会创建一个新实例并将新引用值复制到变量中。因此,它不会影响您传递的变量。另一方面,您正在修改 SelectListItem
的属性。这与分配新引用不同,在这种情况下,由于参数和变量都引用同一位置,因此您正在修改同一对象。
您的参数和类字段之间存在名称冲突。如果您想修改类字段,请使用 this.x = x
。如果不是这种情况,您可以使用 ref
修饰符:
void Assign(ref string x)
{
x="I am modified value";
}
关于c# - 修改其值后两种不同类型的输出存在歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28539501/