2010-05-07 66 views
17

对此SO问题:What is the C# equivalent of friend?,我个人会回答“内部”,就像Ja在答案中做的那样!然而,Jon Skeet说C#中没有VB Friend的直接等价关系。如果乔恩Skeet这样说,我不会是另一个告诉! ,PC#内部VS VBNET朋友

我想知道如何可以关键字internal(C#)不是Friend(VBNET)相当于当它们各自的定义如下:

Friend VBNET

所述的Friend (Visual Basic)关键字声明语句指定可以从同一个程序集内访问元素,但不能从程序集外部访问元素。 [...]

internal C#

Internal:访问被限制的当前组件。

据我的理解,这些定义对我来说意义相当。

然后,分别地,当我在VB.NET中编写代码时,我使用Friend关键字指定类或属性只能在声明它的程序集内可访问。在C#中,我使用内部的关键字指定相同。

  1. 我从这个角度做了什么或者什么事吗?

  2. 我没有得到什么改进?

  3. 可能有人请解释如何或在什么朋友和内部不是直接等价?

在此先感谢您的任何答案!

回答

23

我已经说过没有直接相当于“朋友”概念的C++。这与VB.NET Friend概念不一样,它的确在C#中等效于internal

语境是非常重要的 - 不要以为同一个词是指在所有语言中完全一样的东西......“静”就是一个典型的例子:)

+0

我想我被“朋友”关键字弄糊涂了。特别是在读过Ja的“内部”答案之后,并且说这是不正确的。所以,在说.NET时两者是等价的,对吧?这是什么InternalsVisibleToAttribute的东西? – 2010-05-07 18:20:40

+1

@ will:对不起,你是对的 - VB中的朋友确实相当于C#中的内部。这个问题并不正确,因为问题不在于VB。虽然我会在这里编辑我的答案:)为了记录,InternalsVisibleTo是关于一个组件被允许访问另一个组件的内部成员。 – 2010-05-07 18:22:38

+0

+1感谢Jon的回答,以及其他评论过的人。 – 2010-05-07 18:23:05

4

乔恩的(原来的)答案清楚地表明,他的指的是关键字C/C++ friend,它授予对另一个类的私人访问权限。在C#中没有直接的等价物,但有一种方法可以将internal扩展到另一个程序集,主要用于测试。

据我了解,VB.Net Friend是一样的C#internal

(我写了上面的内容,就像Jon在这里添加了一个答案。)

+0

+1谢谢!这解释了我在这里的一点困惑。抱歉! =) – 2010-05-07 18:22:27

+0

如何将“内部”扩展到另一个程序集? – 2010-05-07 18:26:17

+0

@Will:这就是InternalsVisibleTo的功能。阅读:http://blogs.msdn.com/james_world/archive/2005/07/07/436574.aspx – 2010-05-07 18:45:12

2

托管代码中存在C++ friend关键字的大致等价物。虽然它在装配层面上工作,而不是在班级层面。您可以使用[InternalsVisibleTo] attribute

+0

+1感谢您使用InternsVisibleToAttribute的链接! =) – 2010-05-07 18:35:18

3

比较.NET语言时,VB的friend等同于C#的internal。意思是,标记为这样的东西只能从同一个项目/程序集中访问。它可以与protected结合使用,以更好地控制能见度。

InternalsVisibleTo属性可用于测试目的;尽管名称,它适用于VB,就像它对C#一样。应该注意的是,VB直到.NET 4都不支持使用InternalsVisibleTo

+0

+1提到VBNET直到.NET 4.0才支持InternalsVisibleTo。感谢您的回答! =) – 2010-05-10 18:44:19

+0

对于VB.NET 4评论+1。 – MarqueIV 2011-04-04 00:56:54

+0

-1为VB需要.NET 4评论:我有一个VS2k8 VB项目和VB测试项目与InternalsVisibleTo在前者链接到后者,不工作没有它。 (有独立的不相关的宣传功能创建_Accessor类型,使这有点多余,但它仍然工作。)MSDN页面上的评论说,它不适用于VS.NET在VS2k5。 VB.NET 8 - VS2k5不支持正确的注意事项。 VB.NET 9 - VS2k8及以上版本支持.NET 2.0。 – 2013-08-17 05:56:31