C#参考问题

C#参考问题,c#,C#,为什么b.b不会像f.f一样更改为“a2” 谢谢 public class Test { public static void Main() { Foo f = new Foo { f = getStr() }; Boo b = new Boo { b = f.f }; f.f = "a2"; Co

为什么b.b不会像f.f一样更改为“a2”

谢谢

public class Test
{
    public static void Main()
    {
        Foo f = new Foo
        {
            f = getStr()
        };

        Boo b = new Boo
        {
            b = f.f
        };


        f.f = "a2";

        Console.WriteLine(f.f);
        Console.WriteLine(b.b);
    }

    public static string getStr()
    {
        string a = "a1";
        return a;
    }
}

public class Foo
{
    public string f { get; set; }
}

public class Boo
{
    public string b { get; set; }
}

Boo.b
Foo.f
是字符串,而不是指向字符串的指针。

Foo.f
赋值给
Boo.b
Foo.f
的值赋值给
Boo.b
。完成任务后,他们就独立了。更改
Foo.f
不会更改
Boo.b

Boo.b
Foo.f
是字符串,而不是字符串指针。

Foo.f
赋值给
Boo.b
Foo.f
的值赋值给
Boo.b
。完成任务后,他们就独立了。更改
Foo.f
不会更改
Boo.b

为什么?你不能改变它。仅仅因为您在过去将b.b设置为f.f,并不意味着它将继续对其进行任何更改


您设置的是一个值,而不是一个引用。

为什么要设置?你不能改变它。仅仅因为您在过去将b.b设置为f.f,并不意味着它将继续对其进行任何更改


您设置的是一个值,而不是一个引用。

下面是一段简单的代码,演示了我认为您希望看到的内容:

string x = "hello";
string y = x;
x = "there";
此时,您似乎希望
y
“那里”
。但是
x
y
是完全独立的变量-第二个变量中的赋值仅将
x
(对字符串“hello”的引用)的值复制到
y
。第三行为
x
(对字符串“there”的引用)指定不同的值-它不会更改
y
的值,该值仍然是字符串“hello”的引用


您的示例更为复杂,因为它使用具有自动实现属性的单独类型,但基本概念是相同的。

下面是一段简单的代码,演示了我认为您希望看到的内容:

string x = "hello";
string y = x;
x = "there";
此时,您似乎希望
y
“那里”
。但是
x
y
是完全独立的变量-第二个变量中的赋值仅将
x
(对字符串“hello”的引用)的值复制到
y
。第三行为
x
(对字符串“there”的引用)指定不同的值-它不会更改
y
的值,该值仍然是字符串“hello”的引用


您的示例更为复杂,因为它使用具有自动实现属性的单独类型,但基本概念是相同的。

在.NET中字符串是不可变的,这意味着,您发送的不是引用,而是值

在.NET的其他类中,您正在传递引用。像这样:

Car c = new Car();
c.Name = "Ford";
var d = c;
d.Name = "Volvo";
c.Name; //Volvo
但在字符串中,它是这样工作的:

string s = "Hey";
string c = s;
c = "World!";
//s is still "Hey"
有关更多信息,请查看此问题:

当然,其他课程也是如此

Car c = new Car();
c.Name = "Ford";
Car d = c;
//d.Name == "Ford";
d = new Car();
d.Name = "Volvo";
//c.Name is still "Ford"

NET中的字符串是不可变的,这意味着您发送的不是引用,而是值

在.NET的其他类中,您正在传递引用。像这样:

Car c = new Car();
c.Name = "Ford";
var d = c;
d.Name = "Volvo";
c.Name; //Volvo
但在字符串中,它是这样工作的:

string s = "Hey";
string c = s;
c = "World!";
//s is still "Hey"
有关更多信息,请查看此问题:

当然,其他课程也是如此

Car c = new Car();
c.Name = "Ford";
Car d = c;
//d.Name == "Ford";
d = new Car();
d.Name = "Volvo";
//c.Name is still "Ford"

实际上,Boo.b和Foo.F是对字符串的引用(指针)。不是在OP认为的意义上,这就是为什么我没有用那个词而是用“指针”这个词。实际上,Boo.b和Foo.F是对字符串的引用(指针)。不是在OP认为的意义上,这就是为什么我没有用那个词而是用“指针”这个词。