实体框架:数据上下文如何处理重复的对象?

时间:2012-01-11 15:41:00

标签: c# entity-framework

所以今天我发现c#默认按值传递引用类型。这与我认为的理解相反 - 参考类型作为标准参考。哦,好吧。

这让我想到了一个方法,它将实体对象作为参数,附加到上下文,并对其进行了一些更改。该方法未返回该对象。在我的上下文中调用保存更改时,应用了方法中所做的更改。 我当时认为它有效,因为我传递了对象的引用,所以可以愉快地改变它而不必返回任何东西来重新分配。

所以问题是,这是如何工作的? (代码确实按照我的预期工作)。

谢谢,

3 个答案:

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