Dot-Net

VB.NET 中的預設屬性?

  • November 15, 2008

在 .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 庫中看到索引器記錄和索引為“項目”的原因。

引用自:https://stackoverflow.com/questions/293215