将静态成员分配给常量
本文关键字:常量 分配 静态成员 | 更新日期: 2023-09-27 18:27:58
假设您有一个具有共享成员的类来引用已知值,如以下
public class Semaphore()
{
public static int Red = 0;
public static int Yellow = 1;
public static int Green = 2;
}
在VB.Net中,您可以将这些静态(共享)值分配给如下常量:
Public Class Transit
Private Const Red as Integer = Semaphore.Red
End Class
但在C#中,这是不可能的。这是有原因的吗?一些变通方法?
更新
实际上,VB.NET的行为方式与C#相同。至少在VS 2012中是这样。唯一的区别是,在C#中,共享成员甚至在intellisense中都不可用。
您可以使用readonly
(msdn)而不是使用const
。
readonly关键字与const关键字不同。常量字段可以只能在字段声明时初始化。只读字段可以在声明或构造函数中初始化。因此,只读字段可以具有不同的值,具体取决于已使用构造函数。此外,尽管const字段是编译时常量,只读字段可以用于运行时常量,如此行:public static readonly uint l1=(uint)DateTime.Now.Ticks;
C#解决方法示例:
public class Semaphore
{
public static int Red = 0;
public static int Yellow = 1;
public static int Green = 2;
}
class Transit
{
readonly int Red = Semaphore.Red;
}
您是否有意更改Semaphore.Red
:
Semaphore.Red = 5;
如果没有,请使用常量:
public class Semaphore
{
public const int Red = 0;
public const int Yellow = 1;
public const int Green = 2;
}
实际上,VB.NET的行为方式与C#相同。至少在VS 2012中是这样。唯一的区别是,在C#中,共享成员甚至在intellisense中都不可用。
这是因为在VB中,可以在不指定Module
名称的情况下调用所有Public
和Friend
Module
成员:
考虑以下Module
:
Namespace TestNamespace
Module TestModule
Public ReadOnly Property TestPropertyFromModule As String
Get
Return "My Test Property Value"
End Get
End Property
End Module
End Namespace
只要文件顶部有Imports TestNamespace
,就可以调用TestPropertyFromModule
,而无需指定TestModule
名称:
Imports TestNamespace
Public Class TestClass
Public Sub New()
Dim test = TestPropertyFromModule
End Sub
End Class
在C#中,这是不可能的。您必须使用class
名称并编写TestModule.TestPropertyFromModule
。这就是为什么在VB.NET上的intellisense显示了与C#中不同的一组可用方法/property/etc。