将静态成员分配给常量

本文关键字:常量 分配 静态成员 | 更新日期: 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名称的情况下调用所有PublicFriend 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。