Bei der Verwendung von Resharper 4.1 bin ich auf diese interessante Warnung gestoßen: "Zugriff auf ein statisches Element eines Typs über einen abgeleiteten Typ". Hier ist ein Codebeispiel dafür, wo dies auftritt:
class A {
public static void SomethingStatic() {
//[do that thing you do...]
}
}
class B : A {
}
class SampleUsage {
public static void Usage() {
B.SomethingStatic(); // <-- Resharper warning occurs here
}
}
Weiß jemand, welche Probleme es gibt (falls vorhanden), wenn die statischen Elemente von A über B verwendet werden?
Create
aufHttpWebRequest
, die Methode zu verstecken. Neu kompilieren, Code brechen. Viele Programmiersprachen denken immer noch, dass die Welt in Position bleibt.B.SomethingStatic()
gibt die Erklärung ab, dieSomethingStatic
Mitglied von istB
. Das ist nicht wahr.SomethingStatic
ist eindeutig Mitglied vonA
. Die Tatsache, dass es für Mitglieder vonB
(als wäre es ein Mitglied vonB
) unqualifiziert zugänglich ist, ist eine Frage der Bequemlichkeit. Die Tatsache, dass es zugänglich ist, wenn es mit einem qualifiziertB
ist, ist, IMO, ein Fehler.quelle
class Validator : ValidatorBase<ThrowStrategy> {}
. Verwendung :Validator.CheckNonEmpty(str)
. Vergleichen Sie dies mitValidatorBase<ThrowStrategy>.CheckNonEmpty(str)
.Validator.CheckNonEmpty
, dass sich ein statisches Mitglied derValidator
Klasse anders verhält alsValidatorBase<ThrowStrategy>.CheckNonEmpty
ein anderer Typ. Das tut es nicht, was verwirrend ist. Und wenn Sie eine andere abgeleitete Klasse hätten, würden Sie das auch anrufenCheckNonEmpty
? Die Tatsache, dass diese Fehlfunktion Ihnen in einer bestimmten Situation das Tippen ersparen kann, macht sie nicht zu einer guten Funktion.CheckNonEmpty
es zurValidator
Klasse gehört, was es nicht tut, aber das spielt keine Rolle, solange es offensichtlich ist, was es tut.Es ist normalerweise keine Warnung, nur ein Vorschlag. Sie schaffen eine unnötige Abhängigkeit von etwas.
Angenommen, Sie entscheiden später, dass B A nicht erben muss. Wenn Sie den Ratschlägen von Resharper folgen, müssen Sie diese Codezeile nicht ändern.
quelle
Foo
in habenA
, haben Sie bei einer Instanz,B
auf die durch eine Variable verwiesen wirdb
, nicht die gleiche Freiheit wie im statischen Fall, zu sagen, "wo"Foo
nachgeschlagen werden soll. Sie müssen damit beginnenb
, was auch immer Sie tun. Es ist also nicht wirklich dasselbe wie bei der Statik.Ja, ich habe das auch gesehen, ich habe immer angenommen, dass es mich nur warnt, weil es unnötig ist.
A.SomethingStatic();
würde das gleiche tun.quelle