2016-12-15 2 views
-5

Delphiでは、メソッド内で定数を宣言し、その同じメソッドで値を割り当てることができます。次回このメソッドを使用するとき、constは最後に割り当てた値と同じ値を保持します。Delphiの割り当て可能なconstに相当するC#はありますか?

それは、Delphiで次のようになります。
(それがテストされていないので、私は、ここではそのことについて申し訳ありませんデルファイを持っていないが、私が何を意味するかを証明するのに十分である)

procedure Form1.test; 
const 
    AssignableConst: Integer = 0; 
begin 
    ShowMessage(AssignableConst); 
    inc(AssignableConst); 
end; 

するたびにプロシージャのテストを呼び出します。メッセージボックスに最後の値が表示されます。+ 1

この例はまったく役に立たないです。私は、割り当て可能なconstがDelphiでどのように機能するかを示すことだけです。

これに対応するのはC#ですか?
私は、クラス内にプライベート変数を含むソリューションを望んでいません。メソッド内にとどまっていなければなりません。

私の質問は範囲についてです。他に何もない。値がオブジェクトの状態の一部であることは気にしません。それは重要ではありません。重要なのは、メソッドの範囲からしかアクセスできない変数が必要なことです。それ以外はどこにもありません。
これは、割り当て可能なconstを使用して行うことができますので、C#でこれを行うには?

+2

"私は、クラス内のプライベート変数を含むソリューションは必要ありません。メソッド内にとどまっている必要があります。"どうして?永続的な状態を隠すことは、疑わしいアイデアのように聞こえます。 – CodesInChaos

+0

非 '封印された 'クラスの場合は、フィールドに' private'修飾子を使うだけです。適切に名前を付けることは意味があります。 '_testCounter'(testはメソッド名)の場合、他のメソッドは独自のフィールドを持つことができます。 C#ではローカル静的変数がないので、fieldを使用する必要があります。スコープは重要ではありません。本当に必要な場合は、別のクラスにメソッドをカプセル化しようとすることができます。 – Sinatr

+0

このメソッドは、このconst(または必要な場合は変数)が読み書き可能でなければならない唯一のスコープであるため、 – GuidoG

答えて

10

私は、クラス内にプライベート変数を含むソリューションを望んでいませんが、メソッド内にとどまっている必要があります。

しかし、値は(静的メソッドのための、またはタイプ)オブジェクトの状態の一部である - それは、オブジェクト内で宣言フィールドであるためにそれは理にかなっています。

C#ではこれと同等の機能はありません。あなたができる最善の方法は、特定のメソッドからのみ使用されるべきプライベート変数とドキュメントを持つことです。あなたが得ることができる最も近いです

+0

いいえ、オブジェクト内のプライベートフィールドを持つことは意味がありません。メソッドはこのconstが読み書き可能でなければならない唯一のスコープです – GuidoG

+5

次に別のクラスにメソッドを抽出する必要があります –

+0

@GuidoG:しかし*オブジェクトの状態の一部ですか? Zsoltによると、別のクラスを作成してそこにメソッドを置いて、元のオブジェクトの中にその新しいクラスのフィールドを置くことができます。 –

1

を(あなたが本当にしたい場合は、そのためのロスリン・ベースのテストを書くことができる):

class MyClass 
{ 
    static Action CreateCounter() 
    { 
     int counter = 0; 
     return() => { 
      Show(counter); 
      counter++; 
     }; 
    } 

    Action showAndIncrementCounter = CreateCounter(); 

    public ShowAndIncrementCounter() 
    { 
     showAndIncrementCounter(); 
    } 
} 

しかし、私はまだカウンタのインスタンスフィールドを使用してのシンプルなソリューションをお勧めしますし、メソッドの外部からアクセスしないだけです。

+0

私の例では、私は常に値を1で増やしました。それは私のアプリケーションの単なる例であり、メソッド内に何か値を割り当てることができなければなりません。 – GuidoG

+1

@GuidoG So?例を変更するのとまったく同じ方法で私の例を変更することができます。 – CodesInChaos

+0

はい、私は今参照してください、しかし、私はインスタンスフィールドを使用して私の問題のためのより良い回避策になることに同意します – GuidoG

関連する問題