now*_*ed. 13 .net c# string class immutability
这是我上一次采访的方式:
问题:字符串存储在哪里?
答:堆是因为它是参考类型
问题:请解释以下代码:
static void Main(string[] args)
{
string one = "test";
string two = one;
one = one + " string";
Console.WriteLine("One is {0}" , one);
Console.WriteLine("Two is {0}", two);
}
Run Code Online (Sandbox Code Playgroud)
答案:画了两张如下图:
(代表声明, string two = one;

(代表语句, one = one + " string";.在堆上创建一个新字符串并分配)

问题:正确.为下面的代码片段绘制类似的内容:
class Program
{
static void Main(string[] args)
{
Test one = new Test { someString = "test" };
Test two = one;
one.someString = "test String";
Console.WriteLine("One is {0}", one.someString);
Console.WriteLine("Two is {0}", two.someString);
}
}
class Test
{
public string someString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
回答:
[ Test two = one]

one.someString = "test String";
Run Code Online (Sandbox Code Playgroud)

问题:好的.你说的这两个strings和classes是引用类型.那么为什么创建一个新的字符串对象并赋值,而对于类,现有的字符串属性本身会被修改?
答案:因为字符串是不可变的,而类是可变的.
(虽然我清除了采访,但我仍然不明白这种行为.为什么类的设计者在保持字符串不可变的同时使它变得可变?各处都有很多热情的答案,但任何人都可以通过解释这种特殊的行为来简化它用上面的代码?)
字符串被设为不可变的原因之一(即使它们是引用类型)是为了使它们看起来和表现得像基本类型(例如 int、double、float)。
这也是字符串是唯一可以表示为文字(例如,)的引用类型的原因"some string"。许多其他语言也采用相同的方法,例如 Java。
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |