2010-05-07 35 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