internal class Foo
{
public void Fee()
{
Debug.WriteLine("Fee");
}
internal void Fi()
{
Debug.WriteLine("Fi");
}
}
Ich denke, dass Fee () und Fi () gleichermaßen zugänglich sind, da die gesamte Klasse bereits intern ist. Übersehe ich etwas? Gibt es einen Grund, in einem solchen Fall öffentlich oder intern für die Methoden zu wählen?
c#
public-method
ScottS
quelle
quelle
Antworten:
Die
internal class Foo
Deklaration überschreibt die Zugänglichkeit derpublic void Fee()
Methode und macht sie effektiv intern.In diesem Fall hat die Verwendung von intern oder öffentlich für die Methoden den gleichen Effekt. Der einzige Grund, warum ich in einem solchen Fall öffentliche Methoden gegenüber internen Methoden wählen würde, wäre die Erleichterung des Übergangs zu einer öffentlichen Klasse in einer zukünftigen Version, falls Sie dies wünschen.
quelle
Das einzige, was hier in der Antwort fehlt, ist, warum Sie das tun würden.
Einige Bibliotheken haben viele Klassen, die nicht für den Benutzer der Bibliothek gedacht sind, sondern die als öffentlich gekennzeichnete Schnittstellen erben müssen. Zum Beispiel habe ich eine Bibliothek mit einer Klasse, die die IComparer-Schnittstelle erbt, die jedoch nur intern verwendet wird, und ich möchte den öffentlichen Aspekt meiner Bibliothek nicht überladen. Wenn ich die implementierte Compare-Funktion als intern markiere, beschwert sich der Compiler, dass ich den IComparer der Schnittstelle nicht implementiere.
Wie implementiere ich die Schnittstelle erfolgreich und verhindere gleichzeitig, dass sie im öffentlichen Bereich meiner Bibliothek zugänglich ist? Markieren Sie die Klasse als intern, aber die implementierte Funktion als öffentlich.
quelle
Eigentlich - es gibt einen großen Unterschied, wenn Sie Reflexion verwenden; Insbesondere kann Silverlight sehr verärgert sein, wenn Sie versuchen, über Reflektion auf interne Methoden zuzugreifen, selbst wenn Sie Zugriff gehabt hätten. Ich habe Fälle gesehen, in denen ich eine Methode veröffentlichen musste, damit der Code unter Silverlight funktioniert, obwohl er unter normalem .NET funktioniert.
Möglicherweise finden Sie dasselbe mit teilweisem Vertrauen in reguläres .NET.
quelle
Es würde einen Unterschied machen, wenn Ihre interne Klasse eine Schnittstelle implementieren soll. Die Methode, die eine Implementierung einer Schnittstelle darstellt, müsste öffentlich sein.
quelle
Sie haben Recht, sowohl Gebühr als auch Fi sind gleichermaßen zugänglich.
Aus der CSharp-Sprachspezifikation 3.0 unter 3.5.2:
Selbst wenn die Gebühr als öffentlich deklariert wird, ist sie genauso zugänglich wie Foo (dh intern).
quelle
Gemäß der msdn-Dokumentation ist Ihre Foo-Klasse außerhalb Ihrer Assembly nicht zugänglich, sodass es keinen Unterschied macht, die Methoden als intern oder öffentlich zu markieren. Es macht sogar keinen Unterschied, wenn Sie das Attribut InternalsVisibleTo verwenden
quelle
Ich würde nur mit internen Methoden arbeiten, wenn eine Klasse intern ist. Falls Sie Ihre Meinung ändern und die Klasse veröffentlichen, können Sie einfach einen Text ersetzen und fertig.
quelle