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