2010-05-21 2 views
8

Ich möchte wissen, ob eine Klasse von einer anderen erbt, ist es besser, die Klassen teilen ein Sperrobjekt, das an der Basisklasse definiert ist oder ein Sperrobjekt haben definiert auf jeder Vererbungsebene.Was ist die beste Methode für die Verwendung der Sperre in geerbten Klassen

Ein sehr einfaches Beispiel eines Sperrobjekt auf jeder Ebene der Klasse

public class Foo { 
    private object thisLock = new object(); 
    private int ivalue; 

    public int Value { 
    get { 
     lock(thisLock) { 
     return ivalue; 
     } 
    } 
    set { 
     lock(thisLock) { 
     ivalue= value; 
     } 
    } 
    } 
} 

public class Foo2: Foo { 
    private object thisLock2 = new object(); 

    public int DoubleValue { 
    get { 
     lock(thisLock2) { 
     return base.Value * 2; 
     } 
    } 
    set { 
     lock(thisLock2) { 
     base.Value = value/2; 
     } 
    } 
    } 
} 

public class Foo6: Foo2 { 
    private object thisLock6 = new object(); 

    public int TripleDoubleValue { 
    get { 
     lock(thisLock6) { 
     return base.DoubleValue * 3; 
     } 
    } 
    set { 
     lock(thisLock6) { 
     base.DoubleValue = value/3; 
     } 
    } 
    } 
} 

Ein sehr einfaches Beispiel eines gemeinsamen Verriegelungsobjekt

public class Foo { 
    protected object thisLock = new object(); 
    private int ivalue; 

    public int Value { 
    get { 
     lock(thisLock) { 
     return ivalue; 
     } 
    } 
    set { 
     lock(thisLock) { 
     ivalue= value; 
     } 
    } 
    } 
} 

public class Foo2: Foo {  
    public int DoubleValue { 
    get { 
     lock(thisLock) { 
     return base.Value * 2; 
     } 
    } 
    set { 
     lock(thisLock) { 
     base.Value = value/2; 
     } 
    } 
    } 
} 
public class Foo6: Foo2 {  
    public int TripleDoubleValue { 
    get { 
     lock(thisLock) { 
     return base.DoubleValue * 3; 
     } 
    } 
    set { 
     lock(thisLock) { 
     base.DoubleValue = value/3; 
     } 
    } 
    } 
} 

Welche Beispiel der bevorzugte Weg Verriegelung zu verwalten, ist in einer geerbten Klasse?

public class Foo { 
    private readonly object thisLock = new object(); 
    private int ivalue; 

    protected object ThisLock { 
    get { 
     return thisLock; 
    } 
    } 

    public int Value { 
    get { 
     lock(ThisLock) { 
     return ivalue; 
     } 
    } 
    set { 
     lock(ThisLock) { 
     ivalue= value; 
     } 
    } 
    } 
} 

und

public class Foo2: Foo {  
    public int DoubleValue { 
    get { 
     lock(ThisLock) { 
     return base.Value * 2; 
     } 
    } 
    set { 
     lock(ThisLock) { 
     base.Value = value/2; 
     } 
    } 
    } 
} 

Antwort

11

Sie können Ihre zweite Option ziemlich oft in .NET Framework, mit einer Eigenschaft anstelle eines Feldes obwohl (zB die CommunicationObject.ThisLock Property) finden Instanzen eines Sperrobjekts, das Sie haben, sollten der Anzahl der Objekte entsprechen, für die Sie den Zugriff steuern möchten. Wenn alle Unterklassen dieselbe Ressource teilen, sollte es ein einzelnes Sperrobjekt geben, z. B. ein Feld/eine Eigenschaft in der Basisklasse.

+1

.NET Reflector findet 106 (!) Vorkommen einer 'ThisLock' -Eigenschaft innerhalb der Baugruppen, die ich geladen habe. Ich denke also, dass dies zu Recht als * Best-Practice * bezeichnet werden kann. :-) – dtb

Verwandte Themen