当前位置:  开发笔记 > 编程语言 > 正文

VB.NET中的默认属性?

如何解决《VB.NET中的默认属性?》经验,为你挑选了4个好方法。

在.NET的早期阶段,我相信有一个属性可以装饰一个类来指定一个默认属性.

根据我发现的一些文章,这似乎在某个时候已经从框架中被淘汰,因为它有点令人困惑,我可以看到这是怎么回事.

还有,还有另一种方法来获得它提供的功能吗?

它看起来像这样:

 _  
Public Class GenericStat
    ...
    Public Property Value() As Integer
        ...
    End Property
    ...
End Class

这允许你做Response.Write(MyObject)而不是Response.Write(MyObject.Value)......这不是一个非常笨重的例子,但在一些复杂的面向对象的上下文中,它有点可怕.如果有更好的方法,请告诉我.

注意:我不是在寻找Default关键字,它只能用于带参数的属性.



1> Hans Passant..:

那么,.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]来实现此目的.但是这有一个限制,该属性必须有一个索引参数,专门用于避免语法歧义.明确指定属性时,不会强制执行此限制:

   _
  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 Library中记录并索引为"Item"的原因.


因为我的问题的答案是:您做不到。这个人对为什么它不起作用提供了最好的解释。

2> 小智..:

我发现你可以完全按照原始海报的要求使用Widening Operator CType 上面提到但没有太多细节,所以我完全错过了它,因为我试图找到这个问题的答案.此方法本身并未定义默认属性,但它实现了相同的结果.

Public Class GenericStat
    ...
    Public Property Value() As Integer
    ...
    End Property
    ...
    'this could be overloaded if needed
    Public Sub New(ByVal Value As Integer)
        _Value = Value
    End Sub
    '
    Public Shared Widening Operator CType(ByVal val As Integer) As GenericStat
        Return New GenericStat(val)
    End Operator
    '
    Public Shared Widening Operator CType(ByVal val As GenericStat) As Integer
        Return val.Value
    End Operator
End Class

所以现在

Dim MyObject as GenericStat
MyObject = 123

Dim Int as Integer
Int = MyObject   

两者都没有.Value参考,也没有像索引这样的索引器myobject(1)



3> Jonathan All..:

不,这是从VB 7中明确删除的.

当您拥有一长串默认属性时,确切地知道将返回的内容很难.当两个bcFoo方法,也a.Foo(1)a.b.Foo(1)a.b.c.Foo(1)

真正的踢球者是Set.通过删除默认属性,他们还可以删除Set对象分配的关键字.



4> Konrad Rudol..:

在此示例中,它会拉取对象,但不会将其转换为整数.

布赖恩,我不明白为什么使用a无法实现你想要的效果Widening Operator CType.您向我们展示的代码可以使用.但是,请注意隐式转换.他们通常不是一个好主意.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有