Frage

Wie Sie vielleicht schon wissen, das .NET Framework geschützt intern Zugriffsmodifikator auf seltsame Weise funktioniert: es bedeutet nicht, die Klasse geschützt <> und interne , heißt es die Klasse geschützt oder interne ; das heißt, die Klasse oder modifizierte Mitglied aus whitin demselben Baugruppe sowie aus derselben Hierarchie zugegriffen werden.

Also, dies zu wissen: Wann möchten Sie es verwenden? Kannst du ein Beispiel geben? Gibt es eine gute, Beleuchtung Anwendungsbeispiel innerhalb .NET Base Class Library?

War es hilfreich?

Lösung

Ich habe selten nötig, um diese Zugriffsmodifikator Kombination zu verwenden, wie ich in allen außer den extremsten Umständen denken, dass, es ist ein Indikator für schlechtes Design. Aber manchmal ist es notwendig, Hilfsklassen wie Typ-Wandler und Redakteure die Methode in Ihrem Assembly zugreifen zu haben, aber nur abgeleitete Klassen zu erlauben, um Zugang in anderen Anwendungsfällen.

Ein Beispiel könnte ein Anruf sein, der einen Typ in einen String für den Typ Konverter verwandelt. ToString() ist in der Regel nicht für diesen Zweck verwendet, so dass Sie einen ToPersistableString() Anruf haben könnte, dass Sie Ihre Wandler verwenden möchten, so machen Sie es internal. Dann entscheiden Sie, dass die Menschen aus Ihrer Klasse ableiten, die für ihre abgeleiteten Klasse diesen Aufruf als Teil ihrer eigenen Persistenz-Schema verwenden möchten, so dass Sie es so gut machen protected.

.NET Framework Mit
AccessibilityNotifyClients auf Control ist protected internal. Mit Reflector , kann ich sehen, dass dies getan wurde, so dass die CheckedItemCollection von CheckListBox darauf zugreifen könnten beim Wechsel geprüft Staaten.

Andere Tipps

ich es für interne Methoden verwendet habe, die Sie in einem separaten Namensraum für Unit-Tests, der Unit-Test-Namensraum enthalten ist eine Unterklasse der Klasse verwenden können, wollten. die erlaubten die geschützten Methoden zugegriffen werden.

Das heißt es ist ein Argument, alles öffentlich für Unit-Tests zu machen.

Ich möchte ein Beispiel aus ASP.Net MVC-Framework hinzuzufügen:

public abstract class Controller : ControllerBase, <Omitted Interfaces>
{
     protected internal ViewResult View() {
            return View(null /* viewName */, null /* masterName */, null /* model */);
        }

     protected internal ContentResult Content(string content) {
            return Content(content, null /* contentType */);
        }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top