What is the C# equivalent of friend?
There's no direct equivalent of "friend" - the closest that's available (and it isn't very close) is InternalsVisibleTo. I've only ever used this attribute for testing - where it's very handy!
Example: To be placed in AssemblyInfo.cs
[assembly: InternalsVisibleTo("OtherAssembly")]
What is the equivalent of a 'friend' keyword in C Sharp?
You can use the keyword access modifier
internal
to declare a type or type member as accessible to code in the same assembly only.You can use the
InternalsVisibleToAttribute
class defined inSystem.Rutime.CompilerServices
to declare a type as accessible to code in the same assembly or a specified assembly only.
You use the first as you use any other access modifier such as private
. To wit:
internal class MyClass {
...
}
You use the second as follows:
[assembly:InternalsVisibleTo("MyFriendAssembly", PublicKey="...")]
internal class MyVisibleClass {
...
}
Both of these can rightly be considered the equivalent of friend
in C#.
Methods that are protected
are already available to derived classes.
C# equivalent to C++ friend keyword?
Internal
You can use the internal keyword. Your type (or type member) will then only be visible to other types within the same assembly; And also:
If you need your internal types to be visible from other assemblies, you can use the InternalsVisibleToAttribute. This attribute targets your whole assembly and is usually written in the AssemblyInfo.cs file.
PS: Friend keyword doesn't exists in C# but the concept of friendship exists (not exactly the same as the one in C++), it is described on the Friend Assemblies article from the MSDN. Note also that a friend keyword exists in VB.NET and has the exact same behaviour than the C# internal keyword.
C# internal VS VBNET Friend
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 :)
Why does C# not provide the C++ style 'friend' keyword?
Having friends in programming is more-or-less considered "dirty" and easy to abuse. It breaks the relationships between classes and undermines some fundamental attributes of an OO language.
That being said, it is a nice feature and I've used it plenty of times myself in C++; and would like to use it in C# too. But I bet because of C#'s "pure" OOness (compared to C++'s pseudo OOness) MS decided that because Java has no friend keyword C# shouldn't either (just kidding ;))
On a serious note: internal is not as good as friend but it does get the job done. Remember that it is rare that you will be distributing your code to 3rd party developers not through a DLL; so as long as you and your team know about the internal classes and their use you should be fine.
EDIT Let me clarify how the friend keyword undermines OOP.
Private and protected variables and methods are perhaps one of the most important part of OOP. The idea that objects can hold data or logic that only they can use allows you to write your implementation of functionality independent of your environment - and that your environment cannot alter state information that it is not suited to handle. By using friend you are coupling two classes' implementations together - which is much worse then if you just coupled their interface.
Friend WithEvents' in Visual Basic vs. 'private' in C#
Friend
is used for compatibility with older Visual Basic code, where normally a control was used outside the form which contained it.
In C# there isn't that necessity.
private
is a better solution, for new code.
Where is the Friend access modifier intended to be used?
What you have is not a language problem but OOP dogma in general.
The Friend
modifier might be confusing because it doesn't behave as it does in older languages such as C++. The reason why it doesn't behave the same way is because is not the same.
The Friend modifier gives access to the declared object in an assembly scope, which means that any class within the assembly can access that object but it will still not be usable for code consuming your assembly. If it helps look also at C# Internal Modifier.
As to why OOP goes against the C++ way of the Friend Modifier goes beyond my knowledge but perhaps this other SO question might help.
Related Topics
Formatting Doubles for Output in C#
How to Force Garbage Collector to Run
Reading File Input from a Multipart/Form-Data Post
Change System Date Programmatically
Best Way to Remove Duplicate Entries from a Data Table
How to Parse JSON Without JSON.Net Library
No Generic Implementation of Ordereddictionary
Configuration System Failed to Initialize
How to Insert an Image into a Richtextbox
A Field Initializer Cannot Reference the Non-Static Field, Method, or Property
Where Does System.Diagnostics.Debug.Write Output Appear
How to Run an Exe File from My C# Code
Dependency Injection in Attributes