2012-01-11 13 views
2

今日、私はc#がデフォルトで値によって参照型を渡すことを発見しました。これは、私が理解したと思ったものに反するものでした。参照型は参照として参照されます。しかたがない。Entity Framework:データコンテキストは重複オブジェクトをどのように処理しますか?

これは、エンティティオブジェクトをパラメータとして取り込み、コンテキストにアタッチし、それにいくつかの変更を加えたメソッドについて考えさせました。このメソッドはオブジェクトを返しませんでした。私のコンテキストでセーブの変更を呼び出すとき、メソッド内で加えられた変更が適用されました。 私はオブジェクトへの参照を渡していたので、それがうまくいったと思っていましたので、再割り当てする必要はありません。

これはどういう意味ですか? (コードは期待どおりに機能しました)。

ありがとう、

+0

私はC#は、デフォルトで値によって参照型を渡すことを発見を!あなたはこれをどこで見つけましたか? –

+0

あなたは概念を正しく把握していません。この記事の[記事](http://www.yoda.arachsys.com/csharp/parameters.html)です。 – Eranga

答えて

2

はい、このようなことは難しいです。私は数ヶ月間それを考えず、頭をまっすぐにするために数秒間考えなければならなかった。私はそれを長い間理解していましたが。 パラメータが値であるにもかかわらず

は、それはちょうど新しい参照変数が作成され、まだ同じオブジェクトを指していることを意味します。参照によってパラメータを作成すると、同じポインタが渡されますが、もちろん同じオブジェクトを指しています。

パラメータ変数を混乱させると違いがあります。それをnullまたは他のオブジェクトに設定すると、変数 "outside"は影響を受けません。しかし、パラメータが値渡しされた場合、変数をnullまたは別のオブジェクトに設定すると、参照が「外部」に変更されます。

値の型は、パラメータが参照渡しであるか値渡しであるかによって、実際の相違がより頻繁に発生します。値またはメンバー(構造体の場合)への変更は、値渡しの場合は「外部」に反映されません。

ここにはgood explanationの簡単な例があります。

+0

ご返信ありがとうございます(皆様)。完全に意味をなさない。今、あなたが言うように、私は次回は値と参照を渡すことについて考える必要があることを覚えておく必要があります! – Sergio

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