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!
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 :)
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.
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.)
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.
精彩评论