对于给定的类,使用默认属性列表,可以通过执行myClass.defProperty(“key”)来访问列表中的实例对象。您也可以通过键入myClass.defProperty!键来获得相同的结果。Bang vs vs Visual Basic中的默认属性
有人告诉我,使用括号和报价是运行时访问属性的方式快,但我想知道有什么区别,以及如何做每个工作...
我明白通过用括号替换括号,C#具有类似的行为。
对于给定的类,使用默认属性列表,可以通过执行myClass.defProperty(“key”)来访问列表中的实例对象。您也可以通过键入myClass.defProperty!键来获得相同的结果。Bang vs vs Visual Basic中的默认属性
有人告诉我,使用括号和报价是运行时访问属性的方式快,但我想知道有什么区别,以及如何做每个工作...
我明白通过用括号替换括号,C#具有类似的行为。
鉴于在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"];
。没有!
等效的语法。
所以,底线是,!
是不是更好或更差的性能,可能会使代码维护更加困难,所以应该避免。
为了将来的参考......我现在意识到,为了调试的目的,'!'更好,因为它允许您在站在断点上时看到当前索引上项目的内容,而其他人会告诉你'不能查看索引属性“。 – PedroC88 2011-03-02 13:34:07