C# internal VS VBNET Friend

旧时模样 提交于 2019-12-12 10:29:46

问题


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!


回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!