views:

228

answers:

4

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!

+4  A: 

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

Jon Skeet
I guess I got confused by the "friend" keyword. In particular after having read Ja's answer which is "internal", and being said that that was not correct. So, both are equivalent when talking .NET, right? What is this InternalsVisibleToAttribute thing?
Will Marcouiller
@Will: Sorry, you're right - Friend in VB is indeed equivalent to internal in C#. It was not correct in that question, because the question wasn't about VB. Will edit my answer here though :) For the record, InternalsVisibleTo is about one assembly being allowed access to the internal members of another.
Jon Skeet
+1 Thanks Jon for your answer, and the others who commented too.
Will Marcouiller
+2  A: 

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

Steven Sudit
+1 Thanks! This explains my little confusion here. Sorry! =)
Will Marcouiller
How can one extend "internal" to another assembly?
Will Marcouiller
@Will: That's what `InternalsVisibleTo` does. Read: http://blogs.msdn.com/james_world/archive/2005/07/07/436574.aspx
Steven Sudit
Thanks for this link! =)
Will Marcouiller
+2  A: 

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.

Hans Passant
+1 Thanks for the link to InternsVisibleToAttribute! =)
Will Marcouiller
+1  A: 

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.

Grant Palin
+1 For mentioning that VBNET didn't support InternalsVisibleTo until .NET 4.0. Thanks for your answer! =)
Will Marcouiller