c# - 字符串枚举值已修改

标签 c# string

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

String是引用类型还是值类型?

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

看到字符串的值没有改变。我的问题是为什么字符串值没有改变? 如果是引用类型,则应更改字符串值。

class emp
{
    public string id;
}


List<emp> e = new List<emp>() { new emp() {  id = "sdf" }, new emp() { id = "1" }, new emp() { id = "2" } };

e.ForEach(delegate(emp em)
{
    if (em.id == "1")
        em.id = "fghe";
});

这里的值被改变了,因为emp是引用类型

2) 如果string是值类型

public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>,     IEnumerable<char>, IEnumerable, IEquatable<string>

那为什么他们提到字符串是一个类?

最佳答案

这是因为这部分而发生的:

s = "wser";

这完全等同于:

s = new String ("wser");

当你写这个的时候,一个新对象被实例化,它的引用被存储在 s 中。因此,先前的引用在函数范围内完全丢失,并且在范围外没有注意到任何变化。

因此,要注意在另一个范围内更改的引用类型的更改,您不能创建新实例并将其分配给变量名,您必须修改原始引用本身(这不是可能用于 Java 中的字符串对象 - 字符串是不可变的)。

关于c# - 字符串枚举值已修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1388403/

相关文章:

javascript - 用于验证电子邮件前面的一个分号的正则表达式

java - If-Else 字符串

c++ - 在 C++ 中从纯文本生成 HTML(即 br 和 p 标签)

c# - 通过 Web API 请求(用户 session )共享和更新静态集合

c# - 我应该使用异常来处理用户输入验证吗?

c# - 有没有比序列化 XML 更好的东西来在 C# 中存储可以在我自己的程序集中编译的简单数据库?

c# - Fluent Nhibernate List<string> 映射

c# - 在 Windows Mobile 6.5 上使用 Web 服务时导致 WebException 的原因是什么?

c# - 无法在 Windows Phone 7 中将字符串解析为 DateTime

arrays - 将字符串拆分为数组并对每个字符 Swift 执行特定操作