Ich habe ein bisschen Verwirrung mit Eigentum Accessoren.
Ich hätte gerne eine interne Eigenschaft mit dem Set-Accessor, auf die nur abgeleitete Klassen zugreifen können.
so etwas
%Vor%Wenn ich das mache, beschwert sich der Compiler.
MSDN schlägt bei der Erörterung dieses speziellen Fehlers vor, den Zugriffsmodifizierer set
auf private
Das ist nicht wo ich möchte, dass das geht.
Es sieht so aus, als ob Protected Internal
hier eine Option sein sollte, aber die Verwendung dieses Modifikators gibt denselben Fehler
Ich habe das Gefühl, dass mir ein grundlegendes Verständnis von Zugriffsmodifizierern fehlt.
Danke
Weder protected
noch protected internal
sind restriktiver als internal
. Beides würde abgeleitete Typen einer anderen Assembly auf den Setter aber nicht auf den Getter zugreifen lassen. protected internal
ermöglicht den Zugriff auf die union von protected
und internal
, nicht die -Kreuzung . (Es gibt eine Zugriffsebene, die die Schnittmenge in der CLR darstellt, sie wird jedoch von C # nicht angezeigt.)
Am besten ist es, wenn Sie einen privaten Setter und eine geschützte Methode SetMyProperty
verwenden, die den privaten Setter aufruft, wenn er dem entspricht, was Sie erreichen wollen.
Intern ist restriktiver als geschützt. Intern macht das Member auf die aktuelle Assembly beschränkt, während protected für eine beliebige große Anzahl von Nachkommen außerhalb Ihrer Assembly zugänglich ist.
Wenn diese Eigenschaft für Klassen oder Nachkommen außerhalb Ihrer Assembly zugänglich sein soll, müssen Sie das interne Attribut für die Eigenschaft verlieren. Wenn Sie beabsichtigen, dass diese Eigenschaft nur in Ihrer Assembly verwendet wird, müssen Sie die Eigenschaft Accessor intern verwenden.
Das bedeutet leider, dass Sie auf dem Accessor von internen Eigenschaften geschützt aufgeben müssen. Das ist eine Irritation, denn obwohl die Eigenschaft auf Clients innerhalb Ihrer Assembly beschränkt ist, bedeutet das nicht, dass Sie all diesen Clients wirklich vertrauen, dass sie Ihre Property korrekt verwenden. Es macht Sinn, wenn Sie als einziger Autor im Quelltext Ihrer Assemblierung herumlaufen, aber ich würde viel lieber die geschützte Semantik interner Klassen beibehalten, wenn Hunderte von Entwicklern im Quellcode einer großen Assembly herumlaufen.
Aus irgendeinem Grund scheint der Compiler zu glauben, dass eine interne Klasse abgeleitete Klassen in anderen Assemblys haben darf. Das geschützte Feld wird dann für andere Assemblys durch die abgeleitete Klasse als verfügbar betrachtet (dh das Feld hat kein Konzept für den Zugriffsmodifikator seiner Klasse). Der Compiler-Fehler soll anzeigen, dass das angegebene Feld seine Zugriffsrechte übertrifft (obwohl Sie wissen, dass es nie passieren wird).
Tags und Links c#