C#如何使用String获取引用类型行为?

时间:2014-01-15 22:13:39

标签: c# reference-type

这个问题来自我,这个常见的代码示例通常用于解释值类型和引用类型之间的区别:

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是值类型。如何使用字符串演示相同的引用类型行为?

提前致谢。

5 个答案:

答案 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);
}