vb.net中参数化属性和函数有什么区别?

Den*_*nis 11 .net vb.net

我来自C#世界到VB.NET,这让我很困惑.为什么有两种方法可以做同样的事情?或者我不知道有什么不同?

以下是有什么区别的:

Public ReadOnly Property Test(ByVal v as String) As Integer
  Get
     Return SomeOperationOn(v)
  End Get
End Property
Run Code Online (Sandbox Code Playgroud)

Public Function Test(ByVal v as String) As Integer
   Return SomeOperationOn(v)
End Function
Run Code Online (Sandbox Code Playgroud)

你什么时候使用一个而不是另一个?

Enr*_*lio 16

在功能上没有区别,它们都返回基于参数的值.事实上,属性实际上是在编译期间转换为函数,因为MSIL中不存在属性的概念.

然而,从语义上讲,它们应该如何使用有所不同.属性用于表示公开对象的内部状态.另一方面,函数应该在对象的状态上操作,以提供特定问题(查询)的答案或以某种方式(命令)修改状态.

这是一个例子:

Public Class Rectangle
    Private _size As Size

    ReadOnly Property Size() As Size
        Get
           Return _size
        End Get
    End Property

    Public Function IsSquare() As Boolean
        Return _size.Width = _size.Height
    End Function
End Class
Run Code Online (Sandbox Code Playgroud)

虽然Size简单地公开了对象的属性,但该IsSquare函数实际上对对象的内部状态执行操作以回答问题.

基于此原则,VB.NET中参数化属性的最常见用例是表示项目序列的类,其中参数用于通过其位置或某个唯一键访问序列中的特定元素.换句话说,在C#中创建所谓的索引器.


Han*_*ant 14

这个问题背后有很多历史,这可以追溯到1997年微软发布COM自动化规范时.哪个允许属性setter/getters有参数.Visual Basic是该规范的早期采用者,它在很大程度上受语言驱动,以找到VBX扩展模型的替代品.在那段时间里,气体耗尽,它严重依赖于16位编码模型.

C#团队对该功能采取了一种非常严肃的态度,他们绝对讨厌语法含糊不清.这不属于一种全新的语言.VB.NET没有同样的奢侈品,他们不得不至少支持上一代VB6的一些功能.

拉链前进10年,C#团队不得不受到大众需求的反击.索引属性在例如Office对象模型中很普遍.在C#版本4中,它们允许专用于COM接口的索引属性,以减轻编写C#Office代码的痛苦.此外,还添加了可选和命名参数来处理Type.Missing苦难.而动态关键字支持后期绑定,这是COM和Visual Basic的另一个重要特性,在没有该关键字的C#中真的很痛苦.

长话短说,COM很漂亮,IUnknown的优雅是鲜明的.托尼威廉姆斯是背后的天才.视频在这里,非常值得关注.COM Automation的子集IDispatch并不是那么漂亮.但它非常成功.语言会忽视它的风险.C#没有.

这些细节听起来可能是一个漫长岁月的时代,但事实并非如此.下一版本的Windows API,WinRT完全基于IUnknown.否则称为"Metro"或"Modern UI".IDispatch没有生存,取而代之的是IInspectable.


Joe*_*orn 7

该物业还可以有一个二传手:

Public Property Test(ByVal v as String) As Integer
   Get
      Return SomeDictionary(v)
   End Get
   Set
       SomeDictionary(v) = Value
   End Set
End Property
Run Code Online (Sandbox Code Playgroud)

这有所不同,因为它允许你写这样的东西:

MyObject.Test(index) = SomeValue
Run Code Online (Sandbox Code Playgroud)

C#只允许您通过属性索引器进行分配:

MyOjbect[index] = SomeValue;
Run Code Online (Sandbox Code Playgroud)

这意味着在C#中,每种类型只能有一个索引属性.VB.Net允许在一个类型上有多个索引属性.要获得等效语法,C#必须直接公开底层字典,或者如果getter/setter中有其他代码(例如日志记录),则必须创建一个附加类型来包装字典.