7

ちょっと興味がありますが、定数変数のゲッターを持つ方法はありますか? ライブラリの 2 つのバージョンが同じ言語を話していることを確認するために、一種の内部バージョン番号がありますが、プログラマーが使用しているバージョンを確認できるようにしたいと考えています。今私は使用します:

 private const Int16 protocol_version = 1;
 public Int16 ProtocolVersion { get { return protocol_version; } }

しかし、方法があれば const だけでやりたいと思います。

4

4 に答える 4

16

get アクセサーのみを使用してプロパティを宣言できます (set アクセサーを宣言しなくても、private を宣言することさえできません)。

private const Int16 protocol_version = 1;
public Int16 ProtocolVersion { 
    get { return protocol_version; } 
}

これは、定数のみを定義することと同じではありません。定数はコンパイル時に解決されるため、依存プログラムを再コンパイルせずにライブラリを更新すると、プログラムは依然として「古い」値を参照します。次の例を検討してください。

// The class library
using System;

namespace MyClassLibrary {
    public class X {
        public const Int16 protocol_version = 1;
        public Int16 ProtocolVersion { get { return protocol_version; } }
    }
}

// The program
using System;
using MyClassLibrary;

class Program {
    static void Main(string[] args) {
        X x = new X();
        Console.WriteLine("Constant : {0}", X.protocol_version);
        Console.WriteLine("Getter: {0}", x.ProtocolVersion);
    }
}

ここで、最初にコンパイルしてプログラムを実行します。あなたが見るでしょう

Constant : 1
Getter : 1

次に、protocol_version を 2 に変更し、プログラムを再コンパイルせずにクラス ライブラリのみを再コンパイルし、新しいクラス ライブラリをプログラム フォルダに配置して実行します。以下が表示されます。

Constant : 1
Getter : 2

実際には、それが単なる定数である場合、値はコンパイル時に置き換えられます。

あなたが実際に探しているのはstatic readonly変数だと思います。そのようにして、コンパイル時の const 置換を回避し、変数は初期化後に変更できなくなります。

public static readonly Int16 protocol_version = 1;
于 2012-04-28T09:21:06.477 に答える
3

ゲッター/セッターが存在する理由を覚えておく必要があります。カプセル化された変数へのアクセスを制御することです。具体的には、変数がどのように変更され、誰がそれを変更できるかを制御します。const は一度だけ設定され、実行時に読み取り専用のままであるため、そのプロパティを作成する理由はありません。定数を public に設定することは、保護する必要があるプライベート変数ではないため、完全に受け入れられます。

本当に...本当にプロパティにしたい場合は、読み取り専用プロパティとして定義し、セッターを完全にスキップします。

public Int16 ProtocolVersion { get { return protocol_version; } }

ただし、明確にするために、通常はプロパティと同じコーディング スタイルのパブリック定数を使用します。

public const Int16 ProtocolVersion = 1
于 2012-04-28T09:16:52.157 に答える
2

ただ行う:

public const Int16 protocol_version = 1;

constはセッターを持つことができないため、これはパブリック ゲッターを提供します。

于 2012-04-28T09:07:47.853 に答える
0

定数は再割り当てできないため、なぜ定数と呼ばれるのか、protocol_version を作成するだけですpublic

private const Int16 protocol_version = 1;
于 2012-04-28T09:19:37.927 に答える