C# 当对象在另一个类方法中作为参数传递而不使用ref这个词时,对象属性会发生更改。

C# 当对象在另一个类方法中作为参数传递而不使用ref这个词时,对象属性会发生更改。,c#,C#,尽管我在寻找类似的问题和答案,但在C#中我无法理解这一点 我有一个ID为0的对象cCar(类车)。我从我的类CarManager中将此对象传递给名为CreateCarInDB的方法,但没有使用ref单词: public static void CreateCarInDB(Car p_cCar) { int newId = CarDB.SaveNewCar(p_cCar); p_cCar.ID = new Id; } 我只是想理解为什么在执行这个方法之后,如果我看一下,cCar

尽管我在寻找类似的问题和答案,但在C#中我无法理解这一点

我有一个ID为0的对象cCar(类车)。我从我的类CarManager中将此对象传递给名为CreateCarInDB的方法,但没有使用ref单词:

public static void CreateCarInDB(Car p_cCar) 
{
    int newId = CarDB.SaveNewCar(p_cCar);
    p_cCar.ID = new Id;
}
我只是想理解为什么在执行这个方法之后,如果我看一下,cCar对象的Id=1。我是否应该在方法参数之前使用ref这个词,以便该值在方法之外受到影响?我以为我只是传递了值,而不是引用

看来我不需要用ref这个词

我是否应该在方法参数之前使用ref这个词,以便该值在方法之外受到影响

不,因为您没有更改p_cCar的值,它只是一个参考。您正在更改引用的对象的内容

如果您有这样一行代码:

p_cCar = new Car();
。。。您希望调用者看到更改,然后需要
ref
(或
out
)关键字。根据我的经验,你很少想这么做

现实生活中,有人可以把地址写在一张纸上,让你把他们的前门漆成绿色。你可以修改他们房子的外观(油漆前门),他们会看到的。但是,如果你决定在纸上划掉他们的地址,再写一个不同的地址,这不会改变他们对居住地的看法

进一步资料:

我是否应该在方法参数之前使用ref这个词,以便该值在方法之外受到影响

不,因为您没有更改p_cCar的值,它只是一个参考。您正在更改引用的对象的内容

如果您有这样一行代码:

p_cCar = new Car();
。。。您希望调用者看到更改,然后需要
ref
(或
out
)关键字。根据我的经验,你很少想这么做

现实生活中,有人可以把地址写在一张纸上,让你把他们的前门漆成绿色。你可以修改他们房子的外观(油漆前门),他们会看到的。但是,如果你决定在纸上划掉他们的地址,再写一个不同的地址,这不会改变他们对居住地的看法

进一步资料:


在C#中,默认情况下,每个对象都是通过引用传递的。关键字ref主要用于通过引用发送值类型(int,double,…。@GoranĆojanović:不,不是这样。对象根本不被传递。引用是-默认情况下,它们是按值传递的。这是一个非常重要的区别。另请参见:@JonSkeet,我知道,但这种解释可能会让C#35;中的新手感到困惑。@GoranĆojanović:我认为恰恰相反——我认为精确解释它相当容易,但混淆两者(理解引用是什么而不是通过引用传递)可能会导致很多困惑。在“对象通过引用传递”的模型中,简单赋值会发生什么<代码>车辆x=新车();汽车y=x;y、 Make=“福特”?那里没有“通行证”,所以你必须再次捏造事实。使用正确的模型(
x
y
的值只是引用,而不是对象),不需要伪造,并且可以始终保持一致。在C#中,默认情况下,每个对象都是通过引用传递的。关键字ref主要用于通过引用发送值类型(int,double,…。@GoranĆojanović:不,不是这样。对象根本不被传递。引用是-默认情况下,它们是按值传递的。这是一个非常重要的区别。另请参见:@JonSkeet,我知道,但这种解释可能会让C#35;中的新手感到困惑。@GoranĆojanović:我认为恰恰相反——我认为精确解释它相当容易,但混淆两者(理解引用是什么而不是通过引用传递)可能会导致很多困惑。在“对象通过引用传递”的模型中,简单赋值会发生什么<代码>车辆x=新车();汽车y=x;y、 Make=“福特”?那里没有“通行证”,所以你必须再次捏造事实。使用正确的模型(
x
y
的值只是参考,而不是对象),无需捏造,并且可以始终保持一致。