所以今天我发现c#默认按值传递引用类型。这与我认为的理解相反 - 参考类型作为标准参考。哦,好吧。
这让我想到了一个方法,它将实体对象作为参数,附加到上下文,并对其进行了一些更改。该方法未返回该对象。在我的上下文中调用保存更改时,应用了方法中所做的更改。 我当时认为它有效,因为我传递了对象的引用,所以可以愉快地改变它而不必返回任何东西来重新分配。
所以问题是,这是如何工作的? (代码确实按照我的预期工作)。
谢谢,
答案 0 :(得分:2)
是的,这个东西很棘手。我发现自己几个月没有考虑过这个问题,然后不得不考虑几秒钟再次将它直接放在脑子里。虽然我已经了解了很长时间。
即使参数是按值,这只是意味着创建了一个新的引用变量,但仍然指向同一个对象。如果通过引用创建参数,则会传入相同的指针,这当然指向同一个对象。
当你搞乱参数变量时会有所不同。如果将其设置为null或某个其他对象,则变量“outside”不会受到影响。但是如果参数是通过值传入的,那么将变量设置为null或其他对象将改变引用“外部”。
对于值类型,参数是通过引用还是通过值更经常地产生实际差异。如果通过值传递,对值或成员(如果它是结构)的更改将不会反映在“外部”。
这是一个good explanation,其中包含简单的示例。
答案 1 :(得分:1)
C#中的引用类型通过引用传递。这意味着当您传递引用类型时,只将引用传递给该方法而不是实际值
将引用类型对象传递给方法时,实际上是将新引用/指针传递给该对象
让我们通过例子来理解
SomeRefType myRef = new SomRefType();
//above myRef is reference to object of SomRefType type
//pass this reference to a method
SomeMethod(myRef);
SomeMethod(SomeRefType reference)
{
//here reference is a new pointer/reference pointing to same object as myRef
}
答案 2 :(得分:1)
引用通过值传递(即复制引用而不是目标对象) - 它仍然是对同一对象的引用。这与通过引用传递相反,其中原始引用被传递。
希望这说明了一点:
var myObject = new object();
PassByValue(myObject);
Console.WriteLine(myObject == null); // returns false. The fact the method changed its *copy* of the reference to null doesn't affect the caller.
PassByReference(ref myObject);
Console.WriteLine(myObject == null); // returns true. We actually passed in our reference itself, not a copy of the reference; so when the method set it to null, it nulled the reference we held in the caller.
void PassByValue(object obj)
{
obj = null;
}
void PassByReference(ref object obj)
{
obj = null;
}