2010-05-07 7 views
17

Um diese SO Frage: What is the C# equivalent of friend?, hätte ich persönlich "intern" beantwortet, genau wie Ja unter den Antworten! Jon Skeet sagt jedoch, dass es keine direkte Äquivalenz von VB Friend in C# gibt. Wenn Jon Skeet das sagt, werde ich nicht derjenige sein, der etwas anderes sagt! ; PC# interne VS VBNET Freund

ich fragen, wie kann das Schlüsselwort internal (C#) nicht das Äquivalent von Friend (VBNET) werden, wenn ihre jeweiligen Definitionen sind:

Friend VBNET

Die Friend (Visual Basic) Schlüsselwort in Die Deklarationsanweisung gibt an, dass auf die Elemente innerhalb derselben Assembly zugegriffen werden kann, aber nicht von außerhalb der Assembly. [...]

internal C#

Internal: Der Zugriff auf die aktuellen Baugruppe begrenzt ist.

Nach meinem Verständnis bedeuten diese Definitionen für mich ziemlich gleich.

Dann, jeweils, wenn ich in VB.NET codieren, verwende ich das Friend Schlüsselwort, um anzugeben, dass eine Klasse oder eine Eigenschaft nur innerhalb der Assembly zugänglich sein soll, wo es deklariert ist. Das gleiche in C#, verwende ich das interne Schlüsselwort, um das gleiche zu spezifizieren.

  1. Mache ich irgendetwas oder etwas falsch aus dieser Perspektive?

  2. Was sind die Verfeinerungen, die ich nicht bekomme?

  3. Könnte jemand bitte erklären, wie oder in welchem ​​Freund und internen sind keine direkten Äquivalenzen?

Vielen Dank im Voraus für Ihre Antworten!

Antwort

23

Ich habe gesagt, es gibt keine direkte Entsprechung der C++ "Freund" -Konzept. Das ist nicht das selbe wie das VB.NET Friend Konzept, das tatsächlich internal in C# entspricht.

Kontext ist wichtig - nicht davon ausgehen, dass das gleiche Wort bedeutet genau das gleiche in allen Sprachen ... „statisch“ ist ein klassisches Beispiel :)

+0

Ich glaube, ich durch den „Freund“ Stichwort verwechselt wurde. Insbesondere nachdem ich Ja's Antwort gelesen hatte, die "intern" ist, und gesagt wurde, dass das nicht korrekt war. Also, beide sind gleichbedeutend mit .NET, oder? Was ist diese InternalsVisibleToAttribute-Sache? –

+1

@Will: Sorry, du hast Recht - Freund in VB ist in der Tat äquivalent zu internen in C#. Es war in dieser Frage nicht richtig, weil die Frage nicht über VB war. Ich bearbeite meine Antwort hier aber :) Für den Datensatz ist InternalsVisibleTo etwa eine Baugruppe Zugriff auf die internen Mitglieder eines anderen erlaubt. –

+0

+1 Danke Jon für deine Antwort, und die anderen, die auch kommentiert haben. –

4

Jons (original) Antwort, dass er deutlich macht, ist Verweis auf das Schlüsselwort C/C++ friend, das privaten Zugriff auf eine andere Klasse gewährt. Es gibt kein direktes Äquivalent in C#, aber es gibt eine Möglichkeit, internal zu einer anderen Baugruppe zu erweitern, hauptsächlich zum Testen.

Soweit ich es verstehe, VB.Net Friend ist das gleiche wie C# internal.

(Ich schrieb das oben, gerade als Jon hier eine Antwort hinzufügte.)

+0

+1 Danke! Das erklärt meine kleine Verwirrung hier. Es tut uns leid! =) –

+0

Wie kann man "intern" auf eine andere Baugruppe erweitern? –

+0

@Will: Das macht 'InternalsVisibleTo'. Lesen Sie: http://blogs.msdn.com/james_world/archive/2005/07/07/436574.aspx –

2

Es gibt ein ungefähres Äquivalent des C++ - Friend-Schlüsselworts in verwaltetem Code. Es funktioniert zwar auf Assembly-Ebene, nicht auf Klassenebene. Sie können die [InternalsVisibleTo] attribute verwenden.

+0

+1 Danke für den Link zu InternsVisibleToAttribute! =) –

3

Beim Vergleich von .NET-Sprachen entspricht VB friend C# internal. Das heißt, alles, was als solches gekennzeichnet ist, kann nur von demselben Projekt/derselben Assembly aus aufgerufen werden. Es kann mit protected für eine bessere Kontrolle der Sichtbarkeit kombiniert werden.

Das InternalsVisibleTo Attribut kann für Testzwecke nützlich sein; Trotz des Namens gilt es für VB genauso wie für C#. Es sollte beachtet werden, dass VB nicht die Verwendung von InternalsVisibleTo bis 4. .NET unterstützt hat

+0

+1 Zu erwähnen, dass VBNET InternalsVisibleTo bis .NET 4.0 nicht unterstützt. Danke für deine Antwort! =) –

+0

+1 für den VB.NET 4 Kommentar. – MarqueIV

+0

-1 für die VB benötigt .NET 4 Kommentar: Ich habe ein VS2k8 VB-Projekt und VB-Test-Projekt mit InternalsVisibleTo in der ehemaligen Verknüpfung zu den letzteren, die nicht ohne es funktioniert. (Es gibt die separate Funktion zum unabhängigen Publizieren, mit der _Accessor-Typen erstellt werden, die dies etwas überflüssig macht, aber trotzdem funktioniert.) Der Kommentar auf der MSDN-Seite besagt, dass es nicht mit VB.NET in VS2k5 funktioniert. Der richtige Vorbehalt wird von VB.NET 8 - VS2k5 - und darunter nicht unterstützt. Es wird mit .NET 2.0 von VB.NET 9 - VS2k8 - und höher unterstützt. –