问题
To this SO question: What is the C# equivalent of friend?, I would personally have answered "internal", just like Ja did among the answers! However, Jon Skeet says that there is no direct equivalence of VB Friend in C#. If Jon Skeet says so, I won't be the one telling otherwise! ;P
I'm wondering how can the keyword internal (C#) not be the equivalent of Friend (VBNET) when their respective definitions are:
Friend VBNET
The Friend (Visual Basic) keyword in the declaration statement specifies that the elements can be accessed from within the same assembly, but not from outside the assembly. [...]
internal C#
Internal: Access is limited to the current assembly.
To my understanding, these definitions mean quite the same to me.
Then, respectively, when I'm coding in VB.NET, I use the Friend keyword to specify that a class or a property shall be accessible only within the assembly where it is declared. The same in C#, I use the internal keyword to specify the same.
Am I doing something or anything wrong from this perspective?
What are the refinements I don't get?
Might someone please explain how or in what Friend and internal are not direct equivalences?
Thanks in advance for any of your answers!
回答1:
I've said there's no direct equivalent of the C++ "friend" concept. That's not the same as the VB.NET Friend
concept, which is indeed equivalent to internal
in C#.
Context is important - don't assume that the same word means exactly the same thing in all languages... "static" is a classic example :)
回答2:
Jon's (original) answer makes it clear that he's referring to the C/C++ friend
keyword, which grants private access to another class. There is no direct equivalent in C#, but there is a way to extend internal
to another assembly, largely for testing.
As far as I understand it, VB.Net Friend
is the same as C# internal
.
(I wrote the above just as Jon added an answer here.)
回答3:
When comparing .NET languages, VB's friend
equates to C#'s internal
. Meaning, anything marked as such can only be accessed from within the same project/assembly. It can be combined with protected
for greater control over visibility.
The InternalsVisibleTo
attribute can be useful for testing purposes; despite the name, it applies to VB as much as it does to C#. It should be noted that VB did not support the use of InternalsVisibleTo
until .NET 4.
回答4:
There is a rough equivalent of the C++ friend keyword in managed code. Although it works at the assembly level, not the class level. You can use the [InternalsVisibleTo] attribute.
来源:https://stackoverflow.com/questions/2790691/c-sharp-internal-vs-vbnet-friend