2010-05-21 9 views
8

Chcę wiedzieć, czy jedna klasa dziedziczy po innej, czy lepiej jest, aby klasy dzieliły obiekt blokady zdefiniowany w klasie bazowej lub obiekt blokady określone na każdym poziomie spadku.Co to jest najlepsza praktyka używania blokady w odziedziczonych klasach

Bardzo prosty przykład obiektu blokady na każdym poziomie klasy

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

Bardzo prosty przykład obiektu udostępnionego blokady

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

Które przykładem jest preferowanym sposobem zarządzania blokowania w obrębie dziedziczonej klasy?

Odpowiedz

11

Można znaleźć swoją drugą opcję dość często w .NET Framework, wykorzystując właściwość zamiast pola chociaż (np CommunicationObject.ThisLock Property):

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

i

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

. Reflektor .NET znajduje 106 (!) Wystąpień właściwości 'ThisLock' w wczytanych złożeniach. Sądzę, że można to słusznie nazwać * najlepszą praktyką *. :-) – dtb

4

Ile instancje obiektu blokady, który masz, powinny być równe liczbie rzeczy, do których próbujesz kontrolować dostęp. Jeśli wszystkie podklasy dzielą ten sam zasób, powinien istnieć pojedynczy obiekt blokady, np. Pole/właściwość w klasie bazowej.

Powiązane problemy