Bang与Visual Basic中的默认属性

Ped*_*C88 6 .net c# vb.net

对于具有list的默认属性的给定类,可以通过执行myClass.defProperty("key")来访问列表中的实例对象.您也可以通过键入myClass.defProperty!键来获得相同的结果.

有人告诉我,使用括号和报价是运行时访问属性的方式快,但我想知道有什么区别,以及如何做每个工作...

我理解通过用方括号替换括号,C#具有类似的行为.

Eni*_*ity 5

给出Visual Basic.NET中的以下代码:

Dim x As New Dictionary(Of String, String)
x.Item("Foo") = "Bar"
Run Code Online (Sandbox Code Playgroud)

您可以使用以下任一方法访问字典的"Foo"成员:

Dim a = x!Foo
Dim b = x("Foo")
Dim c = x.Item("Foo")
Run Code Online (Sandbox Code Playgroud)

如果你看看Reflector.NET下的IL,你会发现它们都转换为:

Dim a As String = x.Item("Foo")
Dim b As String = x.Item("Foo")
Dim c As String = x.Item("Foo")
Run Code Online (Sandbox Code Playgroud)

因此,它们在IL中都是等价的,当然,它们都以相同的速度执行.

bang运算符只允许您使用符合标准变量命名规则的静态定义键.

使用索引方法,您的键几乎可以是任何有效值(在本例中为字符串),您可以使用变量来表示键.

为了代码可读性,我建议使用x.Item("Foo")符号,因为它是非常清楚的.x("Foo")可以与对过程的调用混淆,x!Foo使其Foo看起来像一个变量而不是一个字符串(它确实是这样).甚至Stack Overflow颜色编码也使它Foo看起来像一个关键字!

此代码的C#等价物是x["Foo"];.没有!语法等价物.

因此,底线是!性能不是更好或更差,只是可能使代码维护更加困难,因此应该避免.