9

最近、自動プロパティについて知り、とても気に入っています。現時点では、できる限りどこでもそれらを使用しようとしています。どこでも使用できるようにするだけでなく、ほとんどの状況でどれだけうまく機能するかを確認する.

今、私はシングルトンを作成していて、「ねえ、ここでも自動プロパティを試してみましょう」と考えました。

public class MySingleton
{
    public static MySingleton MySingleton { get; private set; }

    private MySingleton() {}

    static MySingleton() { MySingleton = new MySingleton(); }
}

私の質問は、「このようなシングルトンを実装するのは良い考えですか?」です。

一般的にシングルトンが良いアイデアかどうかを尋ねているわけではありません。

4

6 に答える 6

16

私は個人的にはそうしません。読み取り専用変数によって裏付けられた読み取り専用プロパティが本当に必要な場合に、決して呼び出さないプライベート セッターで自動的に実装されたプロパティを使用するのは好きではありません。あなたが何を意味するかをより明確にするのは、あと1行のコードだけです。

public sealed class MySingleton
{
    private static readonly MySingleton mySingleton;
    public static MySingleton MySingleton { get { return mySingleton; } }

    private MySingleton() {}

    static MySingleton() { mySingleton = new MySingleton(); }
}

このようにして、シングルトン クラスを変更してプロパティまたは変数を再割り当てしようとする人さえいません。コンパイラがそれらを停止するからです彼らは、セッターを追加するか、変数を非読み取り専用にする必要があります。これはより大きな変更であり、再考することを願っています。

言い換えると:

  • はい、うまくいきます。
  • いいえ、それは良い考えではないと思います。

ただし、C# 6 の時点では、読み取り専用の自動的に実装されたプロパティを使用すると、これは簡単になります。

public sealed class MySingleton
{
    public static MySingleton MySingleton { get; } = new MySingleton();    
    private MySingleton() {}         
    static MySingleton() {}
}
于 2010-01-22T12:50:26.190 に答える
11

私は、ジョンとは少し異なる方向からこれにアプローチします。オブジェクトがシングルトンであるかどうかに関係なく、そもそもプロパティとしてモデル化するのが論理的に最適ですか?

プロパティは...プロパティを表すはずです。(Captain Obvious が再びストライキ!) ほらね。色。長さ。身長。名前。親。物事のプロパティであると論理的に見なすすべてのもの。

論理的にsingletonであるオブジェクトのプロパティを思いつきません。私が思いもよらなかったシナリオを思いついたかもしれません。今朝はまだダイエットドクターペッパーを食べていません。しかし、これはモデルのセマンティクスの乱用ではないかと疑っています。

シングルトンとは何か、それが何かのプロパティであると考える理由を説明できますか?

とはいえ、私自身もこのパターンを頻繁に使用しています。通常は次のようにします。

class ImmutableStack<T>
{
    private static readonly ImmutableStack<T> emptystack = whatever;
    public static ImmutableStack<T> Empty { get { return emptystack; } }
    ...

「空」は論理的に不変スタックのプロパティですか? いいえ。ここで言うことができることの魅力的な利点

var stack = ImmutableStack<int>.Empty;

プロパティが論理的にプロパティであるという私の願望に勝っています。言って

var stack = ImmutableStack<int>.GetEmpty();

奇妙に思えます。

この場合、読み取り専用フィールドと通常のプロパティを持つ方が良いのか、静的 ctor と autoprop を持つ方が良いのかは、そもそもそれをプロパティにするかどうかほど興味深い問題ではないように思えます。「純粋主義者」の気分で、私はおそらくジョンの側にいて、それを読み取り専用フィールドにします。しかし、怠け癖から、論理的に不変のオブジェクトに対してプライベート セッターを使用して autoprops を作成するパターンもよく使用します。

質問のすべての側面を取るのはどうですか?

于 2010-01-22T16:45:29.997 に答える
0

これが正しくない理由はわかりません。結局のところ、自動プロパティは、プライベート (コンパイラによって生成された) バッキング フィールドのアクセサーの構文糖衣にすぎません。

于 2010-01-22T12:48:16.300 に答える
0

もちろん、それで問題はないと思います。

于 2010-01-22T12:48:31.307 に答える