2012-02-11 29 views
5

当使用==和!=运算符时,字符串对象的行为类似于Value类型,这意味着实际对象而不是引用被检查。字符串类型如何传递给方法或分配给C#中的变量?

怎么样参数传递,分配和复制?

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

对于C#中的字符串类型,这也是真的吗?我的意思是会有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 
} 

什么时候会被分配给一个变量?我猜测,引用只会被复制,而实际的对象在String Intern Pool中保持不变。不确定。

messageVar2也会引用同一个对象吗?

谢谢,

回答

3

是的,你是正确的只有引用被复制,对象实例引用是一个和相同的。

您可以轻松地验证这一点使用Object.ReferenceEquals()来测试两个引用指向同一个对象实例 - 我修改你的例子有点表明这一点:

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; 
} 
+0

美观大方;使用字符串时,Object.Equals和Object.ReferenceEquals之间有什么区别? – 2012-02-11 17:52:08

+0

对于字符串'Equals()'将测试*字符串相等*,而不管引用如何。无论两个字符串指向不同的对象实例,“foo”都等于“foo” – BrokenGlass 2012-02-11 17:56:09

0

这正是发生的情况。

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

2

“String对象的行为像一个值类型当使用==和!=运算符时,表示检查实际对象而不是参考。“

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

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

相关问题