这是我上次面试的情况:
问题:字符串存储在哪里?
Answer:堆因为它是引用类型
问题:解释一下下面的代码:
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);
}
Answer:画了两张图如下:
(代表声明,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; }
}
Answer:
[Test two = one
]
one.someString = "test String";
问题:好的。你都说了strings
and classes
是引用类型。那么为什么要为字符串创建一个新对象并为其赋值,而对于类,现有的字符串属性本身会被修改呢?
Answer:因为字符串是不可变的,而类是可变的。
(虽然我通过了面试,但我仍然不明白这种行为。为什么类的设计者在保持字符串不可变的同时使其可变?到处都有很多理论上的答案,但是任何人都可以通过解释这种特殊行为来使其变得简单吗用上面的代码?)
尽管字符串是引用类型,但它们被设为不可变的原因之一是使它们看起来和行为像原始类型(例如 int、double、float)。
这也是字符串是唯一可以表示为文字的引用类型的原因(例如,"some string"
)。许多其他语言也采用相同的方法,例如 Java。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)