2010-10-07 36 views
6

对于给定的类,使用默认属性列表,可以通过执行myClass.defProperty(“key”)来访问列表中的实例对象。您也可以通过键入myClass.defProperty!键来获得相同的结果。Bang vs vs Visual Basic中的默认属性

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

我明白通过用括号替换括号,C#具有类似的行为。

回答

5

鉴于在Visual Basic.NET中下面的代码:

Dim x As New Dictionary(Of String, String) 
x.Item("Foo") = "Bar" 

您可以通过以下任一查阅字典的“富”成员:

Dim a = x!Foo 
Dim b = x("Foo") 
Dim c = x.Item("Foo") 

如果你看一下IL下的Reflector.NET,那么你会发现他们都翻译为:

Dim a As String = x.Item("Foo") 
Dim b As String = x.Item("Foo") 
Dim c As String = x.Item("Foo") 

所以,它们都是等价的t在IL中,当然,它们都以相同的速度执行。

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

使用索引方法,您的键可以是几乎任何有效值(在这种情况下是字符串),您可以使用变量来表示键。

对于代码可读性,我会推荐x.Item("Foo")表示法,因为对于发生的事情非常清楚。 x("Foo")可能会与调用过程相混淆,x!Foo会使Foo看起来像一个变量而不是字符串(实际上是这样)。即使堆栈溢出颜色编码使Foo看起来像一个关键字!

此代码的C#等效项为x["Foo"];。没有!等效的语法。

所以,底线是,!是不是更好或更差的性能,可能会使代码维护更加困难,所以应该避免。

+0

为了将来的参考......我现在意识到,为了调试的目的,'!'更好,因为它允许您在站在断点上时看到当前索引上项目的内容,而其他人会告诉你'不能查看索引属性“。 – PedroC88 2011-03-02 13:34:07