将静态成员分配给const

时间:2013-08-17 16:22:30

标签: c#

假设您有一个包含共享成员的类来引用像

这样的已知值
public class Semaphore()
{
    public static int Red = 0;
    public static int Yellow = 1;
    public static int Green = 2;
}

在VB.Net中,您可以将这些静态(共享)值分配给const,如下所示:

Public Class Transit
    Private Const Red as Integer = Semaphore.Red
End Class

但在C#中这是不可能的。有一个原因?一些解决方法?

更新

实际上,VB.NET的行为方式与C#相同。至少在VS 2012中。唯一的区别是在C#中,共享成员甚至在智能感知中都不可用。

3 个答案:

答案 0 :(得分:2)

您可以使用constmsdn)而不是readonly

  

readonly关键字与const关键字不同。 const字段可以   只能在该领域的声明中初始化。一个只读字段   可以在声明或构造函数中初始化。   因此,只读字段可以具有不同的值,具体取决于   使用的构造函数。此外,虽然const字段是编译时   常量,readonly字段可用于运行时常量,如   这一行: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;
}

答案 1 :(得分:2)

是否可以更改Semaphore.Red

Semaphore.Red = 5;

如果没有,请在那里使用常量:

public class Semaphore
{
    public const int Red = 0;
    public const int Yellow = 1;
    public const int Green = 2;
}

答案 2 :(得分:1)

  

实际上,VB.NET的行为方式与C#相同。至少在VS 2012中。唯一的区别是在C#中,共享成员甚至在智能感知中都不可用。

这是因为在VB中,可以调用所有PublicFriend Module成员而不指定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#中显示不同的可用方法/属性/等等。