2013-04-22 13 views
5

クラス間でコンテキストを渡す最も良い方法は何ですか? refパラメータを使用するか、コンテキストをパラメータとして渡すだけですか?好ましくはコンストラクタにするが、静的メソッドの場合には最良のアプローチは何か?私。パフォーマンス、安全性、デザインなどを考慮する必要があります。参照を使用するときに同時に異なるスレッドがコンテキスト上で動作していると、競合が発生する可能性がありますか? REFキーワードは、あなたがそう変更、参照することにより、ポインタを渡していることを意味他のメソッドとオブジェクトへのエンティティコンテキストの受け渡し

static void Main(string[] args) 
{ 
    var context = new MyEntities(); 

    var myClass = new MyClass(context); 
    myClass.AddPerson(); 
    // or 
    Person.AddPerson(ref context); 
} 

MyClass.cs

public class MyClass 
{ 
    public void MyClass(MyEntities context) { } 

    public void AddPerson() 
    { 
     context.People.AddObject(new Person()); 
    } 
} 

MySecondClass.cs

public partial class Person 
{ 
    public static AddPerson(ref MyEntities context) 
    { 
     // Do something 
    } 
} 
+0

エンティティフレームワークのコンテキストを通常のパラメータとして渡すときに問題やパフォーマンスに問題はありません。最後にDisposedされていることを確認してください。 – Andrei

+3

コンテキストクラスはスレッドセーフではないので、複数のスレッドでコンテキストを使用している場合は、 'ref'修飾子の有無にかかわらず問題を予期しなければなりません。手動スレッド同期( 'lock'などを使用)によって、スレッドの安全性を確保する必要があります。あなたが本当にそれを必要としない場合は、最初に別のスレッドでコンテキストを使用することを避けることをお勧めします。 – Slauma

答えて

3

ここではrefを使用することはまったく必要ありません。オブジェクトを渡すときは、実際にはは参照のコピーを渡します(それ自体がヒープ内のオブジェクトを指す値の型です)。 refキーワードを使用すると、「参照値」を参照として渡しています(まだ混乱していますか?)。これは、実際には実用的ではないように見える関数の範囲外で参照を実際に変更することができ、奇妙なバグの機会に過ぎないことを意味します。

6

Main.cs変数の値は呼び出し元の値を変更します。 AKA:

static void Main(string[] args) 
{ 
    var context = new MyEntities(); 
    Person.AddPerson(ref context); 

    // context is now null 
} 

呼び出し:この場合

public partial class Person 
{ 
    public static AddPerson(ref MyEntities context) 
    { 
     context = null; 
    } 
} 

、あなたは参照渡しすることはなかったでしょう。変数はオブジェクトへのポインタであることを覚えておいてください。単純に渡すだけで、C++のようにオブジェクトのコピーは作成されません。

関連する問題