2013-04-22 90 views
5

我想知道什麼是在類之間傳遞上下文的最佳方式。我應該使用參考參數還是簡單地將上下文作爲參數傳遞?最好是構造函數,但在靜態方法的情況下,最好的方法是什麼?即性能,安全性,設計等等。在將上下文作爲參數傳遞的過程中是否存在性能問題?如果不同的線程在使用引用的同時在上下文中工作,可能會發生衝突嗎?將實體上下文傳遞給其他方法和對象

Main.cs

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

當您將實體框架上下文作爲普通參數傳遞時,沒有問題或性能問題。只要確保它終於被處置。 – Andrei 2013-04-22 18:50:38

+3

上下文類不是線程安全的,因此,如果您在多個線程中使用上下文,則無論使用或不使用'ref'修飾符傳遞它,都必須期望出現問題。您必須通過手動線程同步來確保線程安全(使用'lock'等)。如果你真的不需要它,你最好避免在不同的線程中使用上下文。 – Slauma 2013-04-22 18:59:28

回答

3

在這裏完全沒有必要使用ref。當傳遞對象時,你實際上是傳遞引用的副本(它本身是一個指向堆中對象的值類型)。使用ref關鍵字,您通過引用傳遞「引用值」(困惑了嗎?)。這意味着參考實際上可以在函數的範圍之外進行更改,這在任何情況下似乎都不實用,並且只是一個奇怪錯誤的機會。

6

ref關鍵字意味着你通過引用傳遞指針,所以改變變量的值將改變它的來電者。又名:

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++中那樣創建對象的副本。