静态关键字正确使用?

Day*_*yan 8 c# vb.net static

关于static关键字.

到目前为止,通过我自己的研究,我对static关键字的含义有一个大概的了解,但我觉得所有这些不同的描述和细节只会让我更加困惑.目前,我真的不觉得我知道如何正确使用" static"; 它似乎在C#和VB.NET之间使用不同,并且在语言中应用不同,具体取决于您使用它...

在阅读MSDN文章Static(Visual Basic)时,出现了许多问题,特别是当我读到这句话时:

通常,一旦过程终止,过程中的局部变量就不再存在.一个static变量仍然存在,并保留其最新值.

  1. static与C#或Java相同的VB.NET版本是否与大多数语言的概念相同?

  2. 如果static在类中保留一个值,并且我们能够访问该特定成员,而无需实例化该类,则可以安全地使用它吗?换句话说,static在课堂上使用时,我们应该密切关注吗?它们出于某种原因让我想起了全局变量.也许我只是在这里无知,只需要更多的练习来理解他们的目的.

  3. 什么是使用static优势并促进代码可重用性的好方案?

asa*_*yer 9

在C#中,static关键字与VB.NET中shared关键字相同.即,来自静态类和静态类成员(C#编程指南):

静态类和类成员用于创建可在不创建类实例的情况下访问的数据和函数.

在VB.NET中的static工作方式非常不同,因为它适用于变量,而不是类型.

我不知道这种行为是否存在C#等价物.

1)静态的VB.NET版本是否与C#或Java相同,对于大多数语言来说概念是否相同?

这不一样.shared但是是一样的.

2)如果静态保留一个类中的值,并且我们能够访问该特定成员,则无需实例化该类 - 这是否可以安全地使用?换句话说,在类中使用静态时,我们应该密切关注吗?由于某种原因,它们让我想起了全局变量,也许我只是在这里无知,只需要更多练习来理解它们的目的.

要非常小心,它们对应用程序域是全局的.

3)使用静态优势并提高代码可重用性的好方案是什么?

我使用静态列表来缓存用于填充下拉列表的数据集,这样我就不必继续将SQL Server作为一个示例.


Gid*_*rth 6

其他答案涉及静态的C#用法,所以我将Static在VB.NET中讨论,因为你引用了一篇关于它的MSDN文章.在VB.NET中创建静态局部变量时,编译器会将其转换为类级变量,该变量只能由在代码中声明变量的函数中的代码引用.所述变量是实例还是共享变量取决于包含函数.例如,这段代码:

Public Class StaticTest

    Public Function Process(value As Integer) As Integer
        Static lastValue As Integer
        Dim result As Integer
        If value > 0 Then
            result = value
            lastValue = value
        Else
            result = lastValue
        End If
        Return result
    End Function

End Class
Run Code Online (Sandbox Code Playgroud)

反编译成这样的东西:

Public Class StaticTest
    ' Methods
    <DebuggerNonUserCode> _
    Public Sub New()
    End Sub

    Public Function Process(ByVal value As Integer) As Integer
        If (value > 0) Then
            Dim result As Integer = value
            Me.$STATIC$Process$20188$lastValue = value
            Return result
        End If
       Return Me.$STATIC$Process$20188$lastValue
    End Function

    ' Fields
    Private $STATIC$Process$20188$lastValue As Integer
End Class
Run Code Online (Sandbox Code Playgroud)

我注意到,假如我lastValuevalue对进入的函数,编译器也创造了某种形式的初始化代码和额外的领域,所以有一些情况下,Static当地人也产生一些额外的代码.

我建议避免使用Static本地,因为我发现它们更容易混淆然后与替代方案相比有用,实际上声明了一个类级实例变量.静态的权衡是:

对于:

  • 无法在其他功能中访问

反对:

  • 无法在构造函数中初始化(但可以使用它们的声明进行内联初始化,这会提供我上面提到的额外的init字段/代码)
  • 无法根据您在代码中的类本地的典型位置来定位
  • 看起来像当地人,但不是


Tim*_*ver 5

  1. VB.NETshared是一样的C#的static.C#static与Java和大多数其他语言中的静态几乎相同.概念继续存在.
  2. 这是一个肯定的,没有任何问题.你不想static在不知道自己在做什么的情况下随意扔掉.但是,它们可以用于很多情况(在#3中更多).它们并不像全局变量,因为它们仍然是"命名空间"并由它们所属的类组织.
  3. 静态成员通常用于实用程序方法和类.例如,C#将大多数Math库实现为静态方法,因为它们只是在进行计算而没有其他副作用.作为一般规则,如果您的方法没有副作用,并且它需要完成其工作的所有数据作为参数.如果要在类的实例之间共享某些数据(例如,跟踪调用给定方法的次数或类似内容),也可以使用静态属性.Static还具有一些内存使用优势,因为它允许您只创建一个类或方法的一个实例,以便在整个应用程序中共享,而不是为每个用法创建新的副本.您还可以使用静态类作为扩展方法,但这是另一个讨论.
  4. 你没有具体问过,但值得一提的是缺点.避免静电的最大原因是可维护性.您不能轻易地继承或扩展静态类,这是一个需要考虑的主要问题.只要你坚持继承规则的组合,这不一定是一个交易破坏者,但缺乏静态类的继承和多态是一个主要的缺点.这个问题本身就会导致很多人建议在所有情况下避免静电.