Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串枚举值已修改_C#_String - Fatal编程技术网

C# 字符串枚举值已修改

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

我还有一个疑问。 我们如何访问字符串的内存

字符串是引用类型还是值类型

1) 如果是引用类型,则执行以下代码

    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");