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

を使用する代わりに、( msdnconst )を使用できます。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;
}
于 2013-08-17T16:33:30.767 に答える
1

実際、VB.NET は C# と同じように動作します。少なくとも VS 2012 では。唯一の違いは、C# では共有メンバーがインテリセンスでさえ利用できないことです。

これは、VBでは、名前を指定せずに allPublicFriend Modulemembers を呼び出すことができるためです。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呼び出すことができます:TestPropertyFromModuleTestModule

Imports TestNamespace

Public Class TestClass

    Public Sub New()
        Dim test = TestPropertyFromModule
    End Sub

End Class

C# では不可能です。classname と writeを使用する必要がありますTestModule.TestPropertyFromModule。そのため、VB.NET の intellisense は、C# とは異なる使用可能なメソッド/プロパティ/その他のセットを表示します。

于 2013-08-17T17:25:48.677 に答える