[英]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.