2013-04-22 12 views
5

Zastanawiam się, jaki jest najlepszy sposób przekazywania kontekstu między klasami. Czy powinienem używać parametru ref lub po prostu przekazać kontekst jako parametr? Najlepiej konstruktorowi, ale w przypadku metody statycznej, jakie jest najlepsze podejście? To znaczy. Wydajność, bezpieczeństwo, projektowanie itp. Czy udało się osiągnąć wydajność jako parametr? Czy możliwe są konflikty, jeśli różne wątki pracują nad kontekstem w tym samym czasie, gdy używasz referencji?Przekazywanie kontekstu podmiotu do innych metod i obiektów

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

Nie ma problemu ani wydajności w przypadku przejęcia kontekstu struktury obiektu jako zwykłego parametru. Po prostu upewnij się, że w końcu jest Disposed. – Andrei

+3

Klasa kontekstu nie jest bezpieczna dla wątków, więc musisz spodziewać się problemów, jeśli używasz kontekstu w wielu wątkach, bez względu na to, czy przekazujesz go z lub bez modyfikatora 'ref'. Trzeba samemu zapewnić bezpieczeństwo gwintów poprzez ręczną synchronizację nici (za pomocą 'blokady' itp.). Lepiej unikaj używania kontekstu w różnych wątkach, jeśli naprawdę tego nie potrzebujesz. – Slauma

Odpowiedz

3

Stosowanie tutaj ref jest całkowicie niepotrzebne. Podczas omijania obiektów jesteś w stanie przekazać kopię odwołania (która sama w sobie jest typem wartości, który wskazuje obiekt w stercie). Używając słowa kluczowego ref, podajesz "wartość odniesienia" przez odniesienie (zdezorientowany jeszcze?). Oznacza to, że odniesienie może w rzeczywistości zostać zmienione poza zakresem funkcji, co w praktyce nie wydaje się praktyczne i jest tylko szansą na dziwne błędy.

6

sędzia słów kluczowych oznacza, że ​​jesteś przechodzącej przez wskaźnik odniesienia, więc zmieniając wartość zmiennej zmieni ją dla osoby dzwoniącej. AKA:

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

    // context is now null 
} 

numerem:

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

W tym przypadku nie będzie miała przechodzić przez odniesienie. Pamiętaj, że zmienna jest wskaźnikiem do obiektu, więc po prostu przekazanie go nie spowoduje utworzenia kopii obiektu w C++.

Powiązane problemy