我来自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.
该物业还可以有一个二传手:
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中有其他代码(例如日志记录),则必须创建一个附加类型来包装字典.
| 归档时间: |
|
| 查看次数: |
7467 次 |
| 最近记录: |