3

クラスがあるとしましょう:

public class foo
{

    public string bar 
    {
        get { return "A Value"; }
    }
}

bar に含まれる値にのみアクセスしたい場合で、実際のクラスには興味がない場合は、次のようにすることができます。

string value = new foo().bar;

これは本当に値にアクセスする最良の方法ですか? このプロパティ (およびクラス) を静的にしたくありません。

アクセスしたい bar プロパティを持つ多くのクラスがある場合、それを行うためのより一般的な方法はありますか?

編集:静的ではない理由は、オーバーライドされたプロパティであり、静的にすることはできないと私は信じています:

public class parent
{
    public abstract string bar { get; }
}

public class foo : parent
{
    public override string bar
    {
        get { return "A Value"; }
    }
}
4

2 に答える 2

7

staticインスタンスなしでメソッドとプロパティを許可するものを使用する必要があります。

public class foo
{
    public static string bar 
    {
        get { return "A Value"; }
    }
}

インスタントレスメンバーを持つことについて私が知っている他の方法はありません(constsとそれはある意味で制限されている以外)。

于 2013-06-10T11:42:00.680 に答える
1

あなたの例に基づいて、値は定数であると想定しているため、staticプロパティを使用する代わりに、を使用できますconst(ほぼ同じですが、より明示的です):

public class Foo
{
    public const string Bar = "A value";
}

そしてそれにアクセスします:

string value = Foo.Bar;

...しかし、それはこの変数で何をしたいかによって異なります-それについて詳しく説明できるかもしれません。

いずれにせよ、静的変数には用途がある場合がありますが、無理をしないでください。私は個人的に、静的な操作 (特に静的な操作) を可能な限り回避するように常に心がけています。たとえば、この投稿の静的なファサードを参照してください。

Barまた、パブリック プロパティとクラス名はパスカル表記に従う必要があることに注意してくださいFoo

別のオプションは、値を提供するプロバイダー コンポーネントを挿入することです。依存性注入コンテナーがこれを処理し、アプリケーションの起動時に正しい有効期間を指定できます。デフォルトの実装 (たとえば、構成ファイルから値を取得する) は簡単に置き換えることができます。繰り返しますが、それはすべて、これをどこまで進めたいか、およびこの「値」がどれほど複雑であるかに依存します。それが文字列のみの場合は、単純にしてください:)

于 2013-06-10T11:51:58.837 に答える