为什么一次又一次地重新分配字符串对象?

Tim*_*Tim -1 c#

不是string一成不变的吗?为什么line在以下示例中可以一次又一次地重新分配file.ReadLine()?谢谢.

int counter = 0;
string line;

// Read the file and display it line by line.
System.IO.StreamReader file = 
   new System.IO.StreamReader("c:\\test.txt");
while((line = file.ReadLine()) != null)
{
   Console.WriteLine (line);
   counter++;
}

file.Close();

// Suspend the screen.
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 15

字符串不可变吗?

是的,字符串是不可变的.

为什么可以一次又一次地重新分配以下示例中的行

line不是一个字符串.line是一个引用字符串的变量.变量称为变量,因为它们各不相同.

这可能意味着这个事实是引用的属性.它不是.

数字1是不可变的,对吧?无论你对1做什么,它都是1.如果你加10到1得到11,你没有改变 10或1. 10和1仍然是10和1.结果是11,一个全新的数字.

所以,如果数字是不可变的,那么为什么我可以说:

int x = 1;
x = x + 10;
Run Code Online (Sandbox Code Playgroud)

?因为x不是数字. x是一个包含数字的变量,变量可以变化.

让我们想想另一个例子.想想在现实生活中不可改变的事物.比方说,硬币的价值.如果你有一毛钱,你可以做任何事情让它值得多于或少于10美分仍然有一角硬币.角色是不可变的.假设你有一个抽屉,你只保留一枚硬币,今天它包含一角硬币.明天你从抽屉里取出一角硬币并放入四分之一.如果一角硬币不变,你是怎么做到的? 变量就像抽屉.您可以更改其内容,即使抽屉中的对象是不可变的.

最后,您问题的标题清楚地显示了您混淆的根本原因:

为什么一次又一次地重新分配字符串对象?

对象不是首先可以分配的东西. 可以分配变量,变量不是对象.变量是可以包含值的存储位置.

如果你被某本书教过,变量是一种对象 - 许多初学者书籍都会犯这个错误 - 然后扔掉那本书,得到一本不太充满谎言的好书.返回的字符串ReadLine是一个对象.将该对象的引用分配给该变量.然后,该变量的对不可变对象的引用.

C#中有两件看起来像变量但语义略有不同的东西.

首先,const本地或字段不是变量,因为常量不能变化.如果它们可以变化那么它们将是变量,而不是常量.如果你说

const string s = "Hello";
Run Code Online (Sandbox Code Playgroud)

那么不仅是Hello不可改变的,而且s也是不可改变的.您应该只const用于逻辑上不可变的东西.黄金的价格,银行的名称,姓氏,这些都可以改变.黄金的原子量,pi的价值,这些东西永远不会改变,所以它们可以const.C#只允许某些类型const,并且只允许某些表达式初始化a const.

readonly字段是半之间的const和的变量.readonly字段是构造函数或字段初始值设定项中的变量,从任何其他位置写入都是非法的.C#将readonly字段视为构造函数或字段初始值设定项之外的所有代码中的,而不是变量.