c# - 修改其值后两种不同类型的输出存在歧义?

标签 c# .net

我有两个类型为 stringSelectListItem 的变量,并尝试在我的代码中使用它们,我发现了一些奇怪的东西并寻找原因。

场景 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/

相关文章:

.net - 检查 F# 泛型参数是否具有相等或比较约束

c# - 单击 DataGridView 中的行标题的事件

c# - 我不能在 LinkBut​​ton 中使用 Eval 吗?

c# - 我可以保存回发状态并恢复吗?

c# - 最终用户如何选择 Dock、Anchor、Location、

c# - 如何获得两列相乘的总和

c# - 在 C# 中通过远程处理获取外部 IP 地址

c# - .Net:导航到不同表单时维护表单windowState

.net - 您发现自己经常在类(class)前面/附加哪些名字?

c# - 命令 '/bin/sh -c dotnet restore ./DockerTestDebian.csproj' 返回非零代码 : 1