2017-03-17 65 views
1

我多次阅读以下句子:“变量应该被赋予最小范围”。真?

通常情况下,变量应给予最小范围。

看到使用可变num在以下情况:

Private num As Integer 
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick 
    'Your code where num is initialized and used 
End Sub 

或者:

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick 
    Dim num As Integer 
    'Your code where num is initialized and used 
End Sub 

裸记住,Timer_Tick是一个循环计时器,因此在第一个场景num只声明一次,而在第二种情况下,每当计时器滴答时声明它。

第一个用法在代码执行速度方面真的不同吗?哪一个更有效?关于这些例子,所引用的句子在多大程度上正确地忽略了可读性偏好?

我相信如果代码中有大量的迭代和循环,第二种情况会对第一种情况有一定的性能影响。

+1

我希望可读性和错误率低于声明一次(如果有)的任何小好处。将它声明为尽可能接近你使用它的地方(在这里的'Tick'事件中),在你修改代码时会更容易找到它,并且在它之外的其他地方意外更改它的机会更少'Tick'事件。 –

+1

是的,第二种选择更好。这是一个计算机科学101的东西。课程编号为COMP 170,18年前,我还记得我的教授贝尔德博士解释它(尽管不是真正的词语或推理......只是这是更好的选择)。但是,简而言之,它允许更快地收集内存,防止意外泄漏不良状态,帮助您避免名称空间中的混乱,因此重要的事情突出,将名称和类型放在更接近它们的用途,以便更容易修改和推理。我可以继续。 –

+0

@GrantWinney你是对的,但我没有考虑速度和性能的可读性问题。 –

回答

0

一般来说,变量应该是最小的范围。

我同意。

第一个用法在代码执行速度方面真的不同吗?

不是因为范围本身。

哪一个更有效?

如果这只是一个范围问题,那么我希望它们能够编译成非常相似的CIL,如果不相同,并且没有差异。可能会有一些小小的怪癖让人轻微击败对方,但是这样的怪癖可能会以任何一种方式发生。

在这种情况下,虽然范围上的差异意味着没有像like与like的比较;方法之外的字段与本地内部不同。通常情况下,一个字段的使用比本地更昂贵,但如果初始化需要只发生一次,本身就很昂贵,那么高速缓存(“memoisation”)就可以得到回报。然而,这不仅仅是一个范围的差异。范围往往不会有明显的性能影响,除非它隐藏了一些也使其不像一样的东西(例如,捕获的本地与非捕获的不一样)。

关于这些例子,引用的句子在多大程度上正确地忽略了可读性偏好?

引用的句子全部是关于可读性和事实,即您知道变量的使用范围与其允许的使用范围有关。范围越紧密越能反映意图,这是人类可读代码应该争取的。

我相信如果代码中有大量的迭代和循环,第二种情况会对第一种情况产生一些性能影响。

仅仅因为它不仅仅是在这里玩的范围,而且也是变量的类型。