Question

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.

  1. Am I doing something or anything wrong from this perspective?

  2. What are the refinements I don't get?

  3. Might someone please explain how or in what Friend and internal are not direct equivalences?

Thanks in advance for any of your answers!

Was it helpful?

Solution

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 :)

OTHER TIPS

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.)

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.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top