Vb.net 将一个大型实例方法移动到shared,并创建一个实例存根——好主意?

Vb.net 将一个大型实例方法移动到shared,并创建一个实例存根——好主意?,vb.net,Vb.net,快速问题:如果我在一个类中有一个非常大的函数/子函数,它是一个实例方法(即,不是共享的),那么通过将它移动到一个共享方法,然后声明一个小存根方法供实例使用,我会得到或失去什么 也就是说,我从这个角度出发: Public Sub MyBigMethod(ByVal Foobar As String) If String.IsNullOrWhitespace(Foobar) Then Throw New ArgumentNullException("Foobar")

快速问题:如果我在一个类中有一个非常大的函数/子函数,它是一个实例方法(即,不是
共享的
),那么通过将它移动到一个共享方法,然后声明一个小存根方法供实例使用,我会得到或失去什么

也就是说,我从这个角度出发:

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方法,stub方法处理调用共享版本并将自身的实例传递给共享方法,以便它可以执行任何需要执行的操作。但我敢打赌,由于增加了函数调用开销,我牺牲了非常小的速度

对吗

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

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

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


您采用了一种逻辑思路,但它是基于这样一种假设:每个实例都有自己的逻辑指令——当它们实际用于一个类的所有实例时。

听起来有点像中断处理程序在CPU级别的工作方式。它只保存刚刚中断的线程的状态,然后在返回之前恢复它们。因此,如果我的假设是错误的,那么把一个大函数作为一个共享的方法是没有任何好处的?@hamlin11:Re,第三段:那么在一个类上使用一个共享的方法有什么好处呢?仅在处理不需要直接对类的实例变量进行操作的实用方法的情况下,共享方法实际上会带来一些线程安全问题。就CPU而言,共享方法和实例方法之间没有区别。这只是汇编语言指令。编译器在将程序提交到程序集之前确定谁可以访问这些指令。@hamlin11:我还不需要线程。但这实际上是我要修补的短名单。我想我的混搭部分来自于C如何使用静态方法(从内核的角度来看)。大多数时候,您只需要考虑共享/静态成员或函数的“我需要做什么?”。它是应用于一个对象,还是应用于类级别的对象?例如,在产品类中,Save()函数应该是一个实例函数。但是,Product.ReturnAllProducts()应该是一个共享函数,因为它适用于所有产品。有些人使用实例成员/函数来跟踪集体对象信息,例如ProductCountInMemory,它可以在构造函数/析构函数中递增/递减