C# 字符串枚举值已修改
我还有一个疑问。 我们如何访问字符串的内存 字符串是引用类型还是值类型 1) 如果是引用类型,则执行以下代码C# 字符串枚举值已修改,c#,string,C#,String,我还有一个疑问。 我们如何访问字符串的内存 字符串是引用类型还是值类型 1) 如果是引用类型,则执行以下代码 List<String> strLst = new List<string>() { "abc","def","12"}; strLst.ForEach(delegate(string s) { if (s == "12") { s = "wser"; // I
List<String> strLst = new List<string>() { "abc","def","12"};
strLst.ForEach(delegate(string s)
{
if (s == "12")
{
s = "wser";
// I doubted whether = operator is overloaded in string class
//StringBuilder sb = new StringBuilder(s);
//s = sb.Append("eiru").ToString();
s = String.Concat(s, "sdf");
}
});
那么为什么他们提到string是一个类呢?string类型是一个引用类型,但它是不可变的。这意味着您不能更改字符串的内容
实际上,它的行为类似于值类型,但只传递引用,而不是整个字符串对象。发生这种情况是因为以下部分:
s = "wser";
这完全等同于:
s = new String ("wser");
当您编写这个时,一个新对象被实例化,它的引用存储在s中。因此,先前的参考在功能范围内完全丢失,在范围外未发现任何更改
因此,要注意在另一个作用域中更改的引用类型中的更改,您不能创建新实例并将其分配给变量名,必须修改原始引用本身(这对于Java中的字符串对象是不可能的-字符串是不可变的)。来自MSDN联机页面- 字符串是不可变的——不能更改字符串对象的内容。虽然字符串是引用类型,但定义相等运算符(=和!=)是为了比较字符串对象的值,而不是引用
如果将对对象的引用存储在变量中,然后更改引用,则对象不会更改,只会更改变量。您正在更改em的一个属性,从而通过变量em影响对象引用。如果您改为
em=something
,它的行为将类似于字符串示例,并且不会影响任何内容。System.String类型确实是一种引用类型,尽管这是一种非常奇怪的类型。从开发人员的角度来看,它是不可变的,CLR将其视为一种值类型,因此您不会犯太大的错误
关于C#中的参数传递、值类型和引用类型,也很好地解释了这一点:
请注意,许多类型(例如字符串)
以某种方式显示为值类型,
但实际上是引用类型。这些
被称为不可变类型。这
意味着一旦一个实例被
构造,它不能被改变。这
允许引用类型执行操作
在某些方面类似于值类型
-特别是,如果持有对不可变对象的引用,则
你可以放心地把它退回
从一种方法或将其传递给另一种方法
方法,安全的知识,它
不会在你背后改变的。
例如,这就是为什么
string.Replace不会更改
字符串,但返回一个
具有新字符串数据的新实例
in-如果原始字符串为
已更改,任何其他持有
对字符串的引用将看到
改变,这是非常罕见的
想要的
字符串是引用类型 在您的示例中,列表中的字符串没有更改的原因是,该方法无法访问列表中的项,而只能获取引用的副本。参数
s
只是方法中的一个局部变量,因此给它赋值不会影响列表的内容。注意这是C#,而不是Java…)我的错:)-但我留下了答案,因为这个概念适用。
s = "wser";
s = new String ("wser");