Dot-Net
VB.NET 中的預設屬性?
在 .NET 的早期,我相信有一個屬性可以用來裝飾類以指定預設屬性。
根據我發現的一些文章,這似乎已在某些時候從框架中刪除,因為它有點令人困惑,我可以看到情況如何。
不過,還有其他方法可以獲得它提供的功能嗎?
它看起來像這樣:
<DefaultProperty("Value")> _ Public Class GenericStat ... Public Property Value() As Integer ... End Property ... End Class這允許你做
Response.Write(MyObject)而不是Response.Write(MyObject.Value)…… 這不是一個非常笨拙的例子,但在一些複雜的物件導向的上下文中它變得有點可怕。請讓我知道是否有更好的方法。**注意:**我不是在尋找 Default 關鍵字,它只能用於帶有參數的屬性。
嗯,.NET 框架確實有一個預設成員的概念。關鍵成分是 DefaultMemberAttribute 類和 Type.GetDefaultMembers()。在 VB.NET 中,指定預設成員是語言語法的一部分:
Public Class Sample Private mValue As Integer Default Public ReadOnly Property Test(ByVal index As Integer) As Integer Get Return index End Get End Property End Class像這樣使用它:
Sub Main() Dim s As New Sample Console.WriteLine(s(42)) Console.ReadLine() End Sub編譯器通過自動發出 [DefaultMember] 來實現這一點。然而,這有一個限制,該屬性必須有一個索引參數,特別是為了避免語法歧義。顯式指定屬性時不強制執行此限制:
<System.Reflection.DefaultMember("AnotherTest")> _ Public Class Sample Public ReadOnly Property AnotherTest() As Integer Get Return 42 End Get End Property End Class但是該預設成員只能通過允許這種語法的語言作為預設值訪問。我不知道 .NET 中的範例,這是在 COM 時代使用的,例如 VB6。也是 VB6 背後具有 Set 關鍵字的核心原因,它解決了歧義並聲明“我的意思是對象,而不是對象的預設屬性”。對於當時的許多初級 Visual Basic 程序員來說,語法細節非常痛苦。
C# 具有完全相同的規則,但不允許相同的靈活性。您可能以前見過索引器:
public class Sample { public int this[int index] { get { return index; } } }此程式碼還使編譯器輸出 [DefaultMember] 屬性。該屬性中的命名屬性是“Item”。這就是為什麼您在 MSDN 庫中看到索引器記錄和索引為“項目”的原因。