不是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字段视为构造函数或字段初始值设定项之外的所有代码中的值,而不是变量.