这个问题来自我,这个常见的代码示例通常用于解释值类型和引用类型之间的区别:
class Rectangle
{
public double Length { get; set; }
}
struct Point
{
public double X, Y;
}
Point p1 = new Point();
p1.X = 10;
p1.Y = 20;
Point p2 = p1;
p2.X = 100;
Console.WriteLine("p1.X = {0}", p1.X);
Rectangle rect1 = new Rectangle
{ Length = 10.0, Width = 20.0 };
Rectangle rect2 = rect1;
rect2.Length = 100.0;
Console.WriteLine("rect1.Length = {0}",rect1.Length);
在这种情况下,第二个Console.WriteLine语句将输出:“rect1.Length = 100”
在这种情况下,类是引用类型,struct是值类型。如何使用字符串演示相同的引用类型行为?
提前致谢。
答案 0 :(得分:5)
你做不到。字符串是不可变的..这意味着你不能直接更改它们。对字符串的任何更改实际上都是要返回的新字符串。
因此,这(我假设你的意思):
string one = "Hello";
string two = one;
two = "World";
Console.WriteLine(one);
..将打印“Hello”,因为two
现在是一个全新的字符串,one
保持不变。
答案 1 :(得分:1)
将字符串作为引用的唯一方法是使用stringbuilder
class Program
{
static void Main(string[] args)
{
string one = "Hello";
string two = one;
two = "World";
Console.WriteLine(one);
StringBuilder sbone = new StringBuilder( "Hello");
StringBuilder sbtwo = sbone;
sbtwo.Clear().Append("world");
Console.WriteLine(sbone);
Console.ReadKey();
}
}
答案 2 :(得分:1)
如何创建一个10MB长的字符串,然后将一个非常大的数组的所有元素设置为等于它,使用任务管理器,您可以显示ram使用率没有增加。
在创建数组之后但在将字符串设置为数组元素之前,请注意进程大小。
答案 3 :(得分:1)
String 是引用类型。它是一个不可变(只读)引用类型。因为它是不可变的,所以每次使用+
或+=
等运算符来修改它时,它都会创建一个新实例。
字符串是只读的这一事实使它们的行为类似于值类型。
答案 4 :(得分:1)
喜欢这样(不要这样做):
string a = "Hello";
string b = a;
unsafe
{
fixed(char* r = a)
{
r[0] = 'a';
}
Console.WriteLine(a);
Console.WriteLine(b);
}