静态关键字正确使用?

时间:2012-07-24 14:15:34

标签: c# vb.net static

关于static关键字。

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

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

  

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

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

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

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

3 个答案:

答案 0 :(得分:9)

在C#中,static关键字与VB.NET中的shared关键字相同。即,来自 Static Classes and Static Class Members (C# Programming Guide)

  

静态类和类成员用于创建数据和函数   无需创建类的实例即可访问。

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

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

1)静态的VB.NET版本是否与C#或Java相同,是概念     大多数语言都一样吗?

这是不同的。 shared是一样的。

2)如果静态保留一个类中的值,我们就可以访问     某个成员,没有实例化类的功能 - 是     这样可以安全使用吗?换句话说,我们应该密切关注     在类中使用静态时?他们让我想起全球化     变量出于某种原因,也许我只是在这里无知     只需要更多练习来了解他们的目的。

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

3)使用静态优势和促销的好方案是什么     代码的可重用性?

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

答案 1 :(得分:6)

其他答案涉及静态的C#用法,所以我将在VB.NET中讨论Static,因为你引用了一篇关于它的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

反编译成这样的东西:

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

我注意到如果我在进入函数时将lastValue设置为value,编译器还会创建某种初始化代码和额外字段,因此在某些情况下Static本地人确实会生成一些额外的代码。

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

有关:

  • 无法在其他功能中访问

反对:

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

答案 2 :(得分:5)

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