Ok, das mag eine etwas dumme Frage sein, und es gibt sicherlich die offensichtliche Antwort, aber ich war neugierig, ob ich hier irgendwelche Feinheiten übersehen habe.
Gibt es einen Unterschied in Bezug auf Sichtbarkeit / Benutzerfreundlichkeit zwischen einem public
in einer internal
Klasse internal
deklarierten Mitglied und einem in einer internal
Klasse deklarierten Mitglied ?
dh zwischen
internal class Foo
{
public void Bar()
{
}
}
und
internal class Foo
{
internal void Bar()
{
}
}
Wenn Sie die Methode als public
und auch deklariert virtual
und dann in einer abgeleiteten Klasse überschrieben haben, ist public
der Grund für die Verwendung dieses Modifikators klar. Ist dies jedoch die einzige Situation ... vermisse ich etwas anderes?
Antworten:
Betrachten Sie diesen Fall:
public interface IBar { void Bar(); } internal class C : IBar { public void Bar() { } }
Hier kann C.Bar nicht als intern markiert werden. Dies ist ein Fehler, da ein Aufrufer von D.GetBar () auf C.Bar zugreifen kann:
public class D { public static IBar GetBar() { return new C(); } }
quelle
public
oder derinternal
Modifikator in einerinternal
Klasse zugelassen wird. In anderen Fällen scheinen sie gleichwertig zu sein.Ein
public
Mitglied ist immer noch geradeinternal
in einerinternal
Klasse.Von MSDN :
Stellen Sie sich das so vor, ich würde auf eine
public
Immobilie zugreifen auf ...? Eine Klasse, die ich nicht sehen kann? :) :)Erics Antwort ist in diesem Fall sehr wichtig. Wenn sie über eine Schnittstelle verfügbar gemacht wird und nicht direkt, macht sie einen Unterschied. Es hängt nur davon ab, ob Sie sich in dieser Situation mit dem Mitglied befinden, mit dem Sie es zu tun haben.
quelle
public
Mitglied einerprivate
Klasse eindeutig ein größerer Bereich als einprivate
Mitglied einerprivate
Klasse (das erstere ist projektweit, das letztere nur eine Klasse).Nur mit einem anderen Beispiel konfrontiert , wo es ist Unterschied zwischen diesen beiden, wenn sie von XAML in WPF verwendet.
XAML:
<Button Tag="{x:Static vm:Foo+Bar.e1}" />
Code mit
internal
Aufzählung wird erfolgreich kompiliert:internal class Foo { internal enum Bar { e1, e2, } }
Aber überraschenderweise führt eine Änderung zu einem
public
Fehler:internal class Foo { public enum Bar { e1, e2, } }
Das letzte Beispiel führt zu einem Kompilierungsfehler:
Leider kann ich nicht erklären, was
public
in diesem Fall falsch ist. Meine Vermutung ist "nur weil WPF so funktioniert". Ändern Sie einfach den Modifikator der verschachtelten Klasse ininternal
, um Fehler zu beseitigen.quelle
public
Mitglieder einerinternal
Klasse könnenpublic
Mitglieder vonpublic
Basisklassen überschreiben und sind daher etwas exponierter ... wenn auch indirekt.quelle
Wenn es um Reflexion geht, ist es wichtig, ob das Mitglied öffentlich ist oder nicht:
Zum Beispiel könnten Sie sogar eine verschachtelte private Klasse an eine WPF-Bindung übergeben, und die Bindung würde wie gewohnt für die öffentlichen Eigenschaften funktionieren.
quelle