字符串类型如何在C#中传递给方法或分配给变量
本文关键字:方法 变量 分配 类型 字符串 | 更新日期: 2023-09-27 18:24:03
String对象在使用==和!=时的行为类似于Value类型运算符,这意味着检查实际对象而不是引用。
参数传递、赋值和复制怎么办?
字符串参数传递:将引用类型传递给方法时,会复制其引用,但基础对象保持不变。
C#中的字符串类型也是这样吗?我的意思是,在下面的代码中会有两个指针(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池中保持不变。不确定。
messageVar2也会引用同一个对象吗?
谢谢,
是的,您是正确的,只复制引用,引用的对象实例是同一个。
使用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;
}
"当使用==和!=运算符时,字符串对象的行为类似于Value类型,这意味着要检查实际对象而不是引用。"
String
类在这方面没有得到任何特殊处理(在语言级别)。==
和!=
运算符比较字符串的值(而不是引用)的原因是因为它们被重载了;请参阅String.Equality运算符和String.Iquality操作符。
任何用户定义的类也可以重载这两个运算符来对对象值执行相等比较(尽管这通常只建议用于不可变类型,如String
)。
这正是发生的事情。
string
s的一个小转折是它们是不可变的:任何看起来像是在修改字符串的操作实际上都会创建一个新的操作。因此,字符串一旦创建就不能更改。除此之外,字符串的工作方式与其他引用类型类似:它们是通过引用访问的,将它们传递给函数会传递引用的副本(除非使用ref
或out
),因此在函数中修改引用不会影响调用代码中的值。
我在这里写了关于这个主题的博客:
http://weblogs.asp.net/stevewellens/archive/2011/01/09/passing-strings-by-ref.aspx