【问题标题】:Make a reference to another string in C#在 C# 中引用另一个字符串
【发布时间】:2012-04-04 05:23:53
【问题描述】:

据我所知,C# 中的字符串是引用类型。

所以在下面的代码中'a'应该等于“Hi”,但它仍然保持它的值“Hello”。为什么?

string a = "Hello";
string b = a;
b = "Hi";

【问题讨论】:

标签: c# string value-type reference-type


【解决方案1】:

许多答案指出字符串是不可变的;虽然这是真的,但它与你的问题完全无关。

更重要的是,您误解了引用在变量方面的工作方式。引用不是对变量的引用。将引用视为一段字符串。你从这个开始:

a----------------------Hello

然后你说“b = a”,这意味着将另一段字符串附加到a附加到的同一事物上

a----------------------Hello
                      /
b---------------------

然后你说“现在将 b 附加到 Hi”

a----------------------Hello

b----------------------Hi

您认为引用的工作方式如下:

a----------------------Hello

那我说ba的另一个名字:

a/b ----------------------Hello

然后我更改b,它更改a,因为它们是同一事物的两个名称:

a/b ----------------------Hi

或者您可能认为引用是这样工作的:

a----------------------Hello

那我说b指的是a

b -------------- a ----------------------Hello

那我改b,间接改了a

b -------------- a ----------------------Hi

也就是说,您希望引用一个变量,而不是一个。您可以在 C# 中这样做,如下所示:

void M(ref int x)
{
    x = 1;
}
...
int y = 0;
M(ref y);

这意味着“在调用 M 期间,x 是 y 的另一个名称”。对 x 的更改会更改 y,因为它们是相同的变量。请注意,变量的 type 不必是引用类型。

【讨论】:

    【解决方案2】:

    b = "Hi"; 行更改了 b 引用的字符串。 a 仍然引用 "Hello"

    string a = "Hello";  // Set a to reference the string "Hello"
    string b = a;        // Set b to reference the same string as a
    b = "Hi";            // Set b to reference the string "Hi"
    

    【讨论】:

      【解决方案3】:

      您正在更改参考 b。不是一个。引用本身被复制,而对象保持不变。所以 b = "Hi" 将对 "Hi" 对象的引用复制到 b 中。这不影响a。

      【讨论】:

        【解决方案4】:

        引用类型的概念是 OOP 程序员最困惑的事情。

        运行下面的代码,你会惊讶地看到答案:

        使用名为Name 的属性创建一个简单的Book 类,并在应用程序的Main 方法中编写以下代码。

        Book a = new Book() {Name = "book a"};
        Book b = new Book() {Name = "book b"};
        
        Book c = a; //line 3
        
        Book a = b; //Line 4
        
        Console.WriteLine(c.Name);
        

        毫无疑问,由于第 4 行,您会期望答案是“book b”。您认为 ca 之后是 a 变为 b,这也将使 c 等于 b

        事实并非如此

        Ballon analogy for Reference type阅读气球类比。

        【讨论】:

        • 好的,在示例中用字符串替换 Book 并检查您是否应该问同样的问题?
        • 好吧,我没有意识到这一行(a="Hi")就像让变量(a)指向另一个对象,我认为它正在改变变量(a ) 指的是。
        【解决方案5】:

        不!

        您所做的是创建两个对字符串“Hello”的引用('a','b')。 使用b = "Hi",您将 'b' 更改为引用字符串“Hi”。

        'a' 永远不会这样改变。

        【讨论】:

          猜你喜欢
          • 2014-07-08
          • 1970-01-01
          • 2018-03-17
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-10
          相关资源
          最近更新 更多