关于static关键字.
到目前为止,通过我自己的研究,我对static关键字的含义有一个大概的了解,但我觉得所有这些不同的描述和细节只会让我更加困惑.目前,我真的不觉得我知道如何正确使用" static"; 它似乎在C#和VB.NET之间使用不同,并且在语言中应用不同,具体取决于您使用它...
在阅读MSDN文章Static(Visual Basic)时,出现了许多问题,特别是当我读到这句话时:
通常,一旦过程终止,过程中的局部变量就不再存在.一个
static变量仍然存在,并保留其最新值.
static与C#或Java相同的VB.NET版本是否与大多数语言的概念相同?
如果static在类中保留一个值,并且我们能够访问该特定成员,而无需实例化该类,则可以安全地使用它吗?换句话说,static在课堂上使用时,我们应该密切关注吗?它们出于某种原因让我想起了全局变量.也许我只是在这里无知,只需要更多的练习来理解他们的目的.
什么是使用static优势并促进代码可重用性的好方案?
在C#中,static关键字与VB.NET中的shared关键字相同.即,来自静态类和静态类成员(C#编程指南):
静态类和类成员用于创建可在不创建类实例的情况下访问的数据和函数.
在VB.NET中的static工作方式非常不同,因为它适用于变量,而不是类型.
我不知道这种行为是否存在C#等价物.
1)静态的VB.NET版本是否与C#或Java相同,对于大多数语言来说概念是否相同?
这不一样.shared但是是一样的.
2)如果静态保留一个类中的值,并且我们能够访问该特定成员,则无需实例化该类 - 这是否可以安全地使用?换句话说,在类中使用静态时,我们应该密切关注吗?由于某种原因,它们让我想起了全局变量,也许我只是在这里无知,只需要更多练习来理解它们的目的.
要非常小心,它们对应用程序域是全局的.
3)使用静态优势并提高代码可重用性的好方案是什么?
我使用静态列表来缓存用于填充下拉列表的数据集,这样我就不必继续将SQL Server作为一个示例.
其他答案涉及静态的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)
我注意到,假如我lastValue要value对进入的函数,编译器也创造了某种形式的初始化代码和额外的领域,所以有一些情况下,Static当地人也产生一些额外的代码.
我建议避免使用Static本地,因为我发现它们更容易混淆然后与替代方案相比有用,实际上声明了一个类级实例变量.静态的权衡是:
对于:
反对:
shared是一样的C#的static.C#static与Java和大多数其他语言中的静态几乎相同.概念继续存在.static在不知道自己在做什么的情况下随意扔掉.但是,它们可以用于很多情况(在#3中更多).它们并不像全局变量,因为它们仍然是"命名空间"并由它们所属的类组织.