关于static
关键字。
到目前为止,通过我自己的研究,我对static
关键字的含义有一个大概的了解,但我觉得所有这些不同的描述和细节只会让我更加困惑。目前,我真的不觉得我知道如何正确使用“static
”;它似乎在C#和VB.NET之间使用不同,并且在语言中应用不同,具体取决于您使用它的目的...
在阅读MSDN文章 Static (Visual Basic) 时,出现了很多问题,特别是当我读到这句话时:
通常,一旦过程终止,过程中的局部变量就不再存在。
static
变量仍然存在并保留其最新值。
static
的VB.NET版本与C#或Java相同,大多数语言的概念是否相同?
如果static
在一个类中保留一个值,并且我们能够访问该某个成员,但是在没有实例化该类的情况下,是否可以安全地使用它?换句话说,在课堂上使用static
时,我们应该密切关注吗?它们出于某种原因让我想起了全局变量。也许我只是在这里无知,只需要更多练习来理解他们的目的。
使用static
优势并提升代码可重用性的好方案是什么?
答案 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
本地人,因为与替代方案相比,我发现它们更加令人困惑然后有用,实际上是声明了一个类级别的实例变量。静态的权衡是:
有关:
反对:
答案 2 :(得分:5)
shared
与C#的static
相同。 C#的static
与Java和大多数其他语言中的静态几乎相同。概念继续存在。static
。但是,它们可以用于很多情况(在#3中更多)。它们并不像全局变量,因为它们仍然是“命名空间”并由它们所属的类组织。