【问题标题】:How a String type get Passed to a Method or Assigned to a Variable in C#?C# 中如何将字符串类型传递给方法或分配给变量?
【发布时间】:2012-03-03 18:22:45
【问题描述】:

使用 == 和 != 运算符时,String 对象的行为类似于 Value 类型,这意味着检查的是实际对象而不是引用。

参数传递、赋值和复制呢?

字符串参数传递: 将引用类型传递给方法时,会复制其引用,但底层对象保持不变。

对于 C# 中的 String 类型,这是否也是如此?我的意思是在下面的代码中会有 2 个指针(messageVar 和 messageParam)指向同一个对象:

public static void main()
{
   string messageVar = "C#";
   Test(messageVar);

   // what about in assignement?
   string messageVar2 = messageVar;
}
public void Test(string messageParam)
{
// logic
}

当它被分配给一个变量时呢?我猜想,引用只会被复制,实际对象在字符串实习生池中保持不变。不确定。

messageVar2 是否也引用同一个对象?

谢谢,

【问题讨论】:

    标签: c# string operators parameter-passing variable-assignment


    【解决方案1】:

    是的,你是对的,只有引用被复制,对象实例引用的对象是一回事。

    您可以使用Object.ReferenceEquals() 轻松验证这一点,以测试两个 references 是否指向同一个对象实例 - 我稍微修改了您的示例以显示这一点:

    static string messageVar = "C#";
    public static void Main(string[] args)
    {
        bool isSame = Test(messageVar); //true
    
        // what about in assignement?
        string messageVar2 = messageVar;
        isSame = Object.ReferenceEquals(messageVar2, messageVar);//also true
    }
    
    public static bool Test(string messageParam)
    {
        // logic
        bool isSame = Object.ReferenceEquals(messageParam, messageVar);
        return isSame;
    }
    

    【讨论】:

    • 不错;使用字符串时,Object.Equals 和 Object.ReferenceEquals 有什么区别?
    • 对于字符串 Equals() 将测试 字符串相等 而不管引用如何,例如无论两个字符串是否指向不同的对象实例,“foo”都等于“foo”
    【解决方案2】:

    “在使用 == 和 != 运算符时,字符串对象的行为类似于值类型,这意味着检查的是实际对象而不是引用。”

    String 类在这方面没有得到任何特殊处理(在语言级别)。 ==!= 运算符比较字符串的值(而不是引用)的原因是因为它们已经被重载;见String.Equality OperatorString.Inequality Operator

    任何用户定义的类也可以重载这两个运算符以对对象值执行相等比较(尽管这通常只建议用于不可变类型,例如String)。

    【讨论】:

      【解决方案3】:

      这正是发生的事情。

      strings 的一个小转折是它们是不可变的:任何看起来像是在修改字符串的操作实际上都会创建一个新的。所以字符串一旦创建就不能更改。除此之外,字符串与任何其他引用类型一样工作:它们通过引用访问,并将它们传递给函数传递引用的副本(除非您使用refout),因此在函数不影响调用代码中的值。

      【讨论】:

        【解决方案4】:

        我在这里写了关于这个确切主题的博客:

        http://weblogs.asp.net/stevewellens/archive/2011/01/09/passing-strings-by-ref.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-30
          • 2020-03-25
          • 1970-01-01
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          • 2022-06-15
          相关资源
          最近更新 更多