簡體   English   中英

靜態/在VB.NET中共享和C#可見性

[英]static/Shared in VB.NET and C# visibility

我面臨着VB.NET和C#(.NET2)中的情況,具有靜態/共享成員的可見性。 在VB.NET中我覺得有點奇怪:

    public class A 
    {
        private static A instance;
        public static A Instance 
        {
            get { return instance; }
        }

        public string Name { get { } }
    }

用法A.Instance.Name // ONLY名稱是“可見的”


VB.NET:

Public Class A
  Private Shared _instance As A

  Public Shared ReadOnly Property Instance() As A
    Get
      Return _instance
    End Get
  End Property


  Public ReadOnly Property Name() As String
    Get
      Return ""
    End Get
  End Property

End Class

用法

A.Instance.Instance.Instance.Instance...

//共享成員的行為就像一個公共類,我可以重復它到無限...

這是微軟的疏忽還是VB.NET的“功能”?

這不是疏忽,但是你的VB代碼觸發警告,這顯然意味着:不要使用這種表示法。

在VB中,靜態成員可以通過實例訪問,因為嚴格來說,VB 沒有static :VB有關鍵字Shared ,意味着成員在所有實例之間共享 ,而不是static成員不屬於任何實例。

現在,這是這些關鍵字之間的語義區別。 碰巧這兩個不同的語義傾向於具有完全相同的效果。

當然,C#中的static現在與VB.NET中的Shared相同,但它們的遺產不同,而VB的Shared只有不同的歷史,因此歷史上有不同的含義。 有了這個意義,通過實例訪問Shared成員是絕對有意義的。

當與Option Strict Off (松散鍵入)一起使用時,它也是有意義的:在這里,您有時不知道變量的類型,但您仍然可能想要訪問Shared成員。 現在,您別無選擇,只能使用實例來訪問它:

Option Strict Off
' … '
Dim o As Object = New A()
' Somewhere else, we want to access a static member of A but we don’t know A: '
Dim instance = o.Instance

這是一個特點; 這不是一個錯誤。 VB正在按設計工作。 關於靜態方法是否可以被視為實例的方法,不同的語言做出了不同的選擇。 VB允許它。 C ++允許它。 C#沒有。

請記住,不同語言的設計標准是不同的,因此做出的決策是不同的。 在C#設計團隊中,我們非常重視語言定義,這使得非法模式看起來很可疑; 因為將實例作為接收器傳遞給靜態方法沒有意義 (除非計算接收器表達式導致副作用),那么為什么允許用戶鍵入無意義的代碼呢?

在VB設計團隊中,他們重視代碼的工作方式,就像您第一次鍵入代碼一樣。 如果看起來有點狡猾,可能會發出警告,但允許它繼續前進。

如果您對C#中靜態調用設計中的一些更微妙的問題感興趣,這是一個有趣的問題:

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

C#編譯器不允許您在對象的實例上引用靜態屬性,僅在類型本身上引用。 這是C#而不是.NET CLR限制。 VB.NET將允許這個,但會警告它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM