1

假设您有一个具有共享成员的类来引用这样的已知值

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# 中,共享成员甚至在智能感知中都不可用。

4

3 回答 3

2

是否Semaphore.Red可以更改您的意图:

Semaphore.Red = 5;

如果没有,请在此处使用常量:

public class Semaphore
{
    public const int Red = 0;
    public const int Yellow = 1;
    public const int Green = 2;
}
于 2013-08-17T16:36:27.970 回答
2

const您可以使用readonly( msdn )而不是使用。

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;
}
于 2013-08-17T16:33:30.767 回答
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# 中这是不可能的。你必须使用classname 和 write TestModule.TestPropertyFromModule。这就是为什么 VB.NET 上的智能感知在 C# 中显示不同的可用方法/属性/等集的原因。

于 2013-08-17T17:25:48.677 回答