8

关于static关键字。

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

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

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

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

  2. 如果static在类中保留一个值,并且我们能够在不实例化类的情况下访问该特定成员、函数,那么松散使用是否安全?换句话说,static在类中使用 's 时我们应该密切注意吗?出于某种原因,它们让我想起了全局变量。也许我只是在这里一无所知,只是需要更多的练习来理解他们的目的。

  3. static什么是使用好处和促进代码可重用性的好场景?

4

3 回答 3

9

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

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

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

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

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

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

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

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

3)使用静态有利于和促进代码可重用性的好的场景是什么?

我使用静态列表来缓存用于填充下拉列表的数据集,这样我就不必一直以SQL Server为例。

于 2012-07-24T14:24:28.613 回答
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

反编译成这样的:

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

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

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

为了:

  • 无法在其他功能中访问

反对:

  • 无法在构造函数中初始化(但可以在其声明中内联初始化,这提供了我上面提到的额外初始化字段/代码)
  • 无法根据您在代码中类本地人的典型位置定位
  • 看起来像当地人,但不是
于 2012-07-24T16:19:47.517 回答
5
  1. VB.NETsharedC# 相同static。C#static与 Java 和大多数其他语言中的 static 几乎相同。概念延续。
  2. 这是一个是与否的问题。您不想static在不知道自己在做什么的情况下随意乱扔 s。然而,它们在很多情况下都很有用(更多关于#3)。它们并不像全局变量,因为它们仍然是“命名空间”并由它们所属的类组织。
  3. 静态成员通常用于实用方法和类。例如,C# 将 Math 库的大部分实现为静态方法,因为它们只是进行计算并且没有其他副作用。作为一般规则,如果您的方法没有副作用,并且完成其工作所需的所有数据都作为参数出现。如果你想在类的实例之间共享一些数据(例如,跟踪给定方法被调用的次数,或类似的东西),你也可以使用静态属性。静态也有一些内存使用的好处,因为它允许您只创建一个类或方法的实例以在整个应用程序中共享,而不是为每次使用创建新副本。您还可以将静态类用于扩展方法,但这是另一回事了。
  4. 你没有特别问,但值得一提的缺点。避免静态的最大原因是可维护性。您不能轻易继承或扩展静态类,这是需要考虑的主要问题。只要您坚持组合优于继承的规则,这不一定会破坏交易,但静态类缺乏继承和多态性是一个主要缺点。这个问题本身就导致很多人建议在所有情况下都避免使用静态。
于 2012-07-24T14:36:17.377 回答