将大型实例方法移动到共享,并创建实例存根 - 好主意?

时间:2011-06-05 05:59:58

标签: vb.net

快速问题:如果我在一个实例方法的类中有一个非常大的函数/ sub(即,不是Shared),那么通过将其移动到共享方法然后声明我是获得还是失去任何东西实例使用的小存根方法?

即,我离开了这个:

Public Sub MyBigMethod(ByVal Foobar As String)
    If String.IsNullOrWhitespace(Foobar) Then
        Throw New ArgumentNullException("Foobar")
    End If

    ' Lots and lots of ugly code.
    ' Really.  There is lots of ugly code here.
    '
    ' Lorem ipsum dolor sit amet, consectetur adipiscing
    ' elit. Aliquam vel erat sit amet massa ultricies
    ' adipiscing. Mauris eu est ligula, a pharetra lorem.
End Sub



对此:

Private Shared Sub MyBigMethod(ByVal Obj as MyObj, ByVal Foobar As String)
    ' Lots and lots of ugly code.
    ' Really.  There is lots of ugly code here.
    '
    ' Lorem ipsum dolor sit amet, consectetur adipiscing
    ' elit. Aliquam vel erat sit amet massa ultricies
    ' adipiscing. Mauris eu est ligula, a pharetra lorem.
End Sub

Public Sub MyBigMethod(ByVal Foobar As String)
    If String.IsNullOrWhitespace(Foobar) Then
        Throw New ArgumentNullException("Foobar")
    End If

    Call MyClass.MyBigMethod(Me, Foobar)
End Sub

我的想法是节省每个对象实例的内存大小。因为每个实例只需要处理stub方法,该方法处理调用共享版本并将自身实例传递给共享方法,以便它可以执行任何需要执行的操作。但是我会打赌,由于增加了函数调用开销,我牺牲了非常小的速度。

正确?

1 个答案:

答案 0 :(得分:2)

  

我的想法是节省每个对象实例的内存大小。

这是不正确的,因为每个实例都不会将该方法存储在内存中。实例方法仅存储在内存中一次。函数指令与类成员(每个实例存储)不同。

此外,通过添加函数调用会获得一些惩罚,因为在调用共享方法时必须保存存根方法的状态。然后,当共享方法终止时,必须将其加载回来。 (注意:这与进行任何非内联函数调用时所采取的惩罚相同;随着参数的数量和大小的增加,惩罚变得更加严厉)

你遵循了一条逻辑思路,但它基于这样的假设,即每个实例都有自己的逻辑指令 - 当它们实际用于所有类的实例时。