3

私の目標:IDとメッセージの両方を持つ事前定義されたエラーのC#クラスを作成します。これが私が試したことです:

public class MyError
{
    public static readonly MyError OK = new MyError(0, "OK");
    public static readonly MyError Bad = new MyError(1, "Bad Stuff");

    public MyError(int id, string message)
    {
        this.Id = id;
        this.Message = message;
    }

    public readonly int Id;
    public readonly string Message;
}

これは問題なくコンパイルされ、実際には問題なく機能すると確信しています。しかし、私は常にコード分析のガイドラインに従うのが好きです。上記の場合、CA2104は「読み取り専用の可変参照型を宣言しない」に違反しています。

読み取り専用の代わりにconstを試す(コンパイルすらしない)など、上記以外の多くのことを試しました。{get; プライベートセット; }メンバーアクセス、クラスの代わりに構造体など。

可変タイプはどれですか?IDまたはメッセージ?

私が望むことを達成するための提案を受け入れます。重要なデータ型の事前定義された定数。

もちろん、私はいつでも警告を無視することができますが、通常はそれらの理由があることがわかりました。

*明確化* 私の質問は、この特定のMyErrorクラスについてではなく、基本的なデータ型以外のものの定数を定義するというより基本的な問題についてです。

doubleである3つの定数を定義したいとします。C#では次のようにできます。

   public const double HighValue = 11.0;
   public const double LowValue = 0.1;
   public const double MidValue = 5.5;

C#は、事前定義されたdoubleの便利な定数をいくつか作成します: NaNMinValueMaxValueNegativeInfinityPositiveInfinity

では、空間内の3次元ベクトル(X、Y、Z)の興味深い定数を事前に定義したい場合はどうすればよいでしょうか。double、integer、stringsなどの定数を定義できますが、些細なことではないものの定数を定義するにはどうすればよいですか?Originは、私が名前を付けたい興味深い定数です。

public class Vector3D
{
    /// The problem is that this does not work
    public const Vector3D Origin = { 0.0, 0.0, 0.0 };

    public double X;
    public double Y;
    public double Z;
}

何千もの定数は必要ありません。私たちの友人のダブルNaNなどで持っているようなほんの数例です。クラスは特に保護されたり封印されたりする必要はありません。誰でも自由にVector3Dオブジェクトを作成し、好きな方法でそこから派生させることができます。値(0.0、0.0、0.0)を持つOriginという名前の特別な定数が欲しいだけです

4

4 に答える 4

3

あなたのタイプは変更可能ではありませんが、コード分析はそれを知りません。
この警告は誤検知です。あなたはそれを抑制するべきです。


編集した質問に答えるには:

constプリミティブにのみ適用できます。
カスタムタイプの場合、static readonlyが唯一のオプションです。

タイプが適切に不変である限り、完全に機能します。

于 2013-03-25T17:43:35.793 に答える
2

タイプは変更できません。コード分​​析は、パブリック読み取り専用フィールドがあると混乱します。

パブリックフィールドをパブリックプロパティにすることで、コード分析の問題を修正できます。

public MyError(int id, string message)
{
    this.id = id;
    this.message = message;
}
private readonly int id;
private readonly string message;
public int Id { get { return id; } }
public string Message { get { return message; } }
于 2013-03-25T17:49:20.307 に答える
1

このクラスのすべてのインスタンスには独自のIDとメッセージがあるため、プロパティは静的であってはなりません。同意しますか?

于 2013-03-25T18:20:23.080 に答える
0

私はそのクラスを作成します

  • 継承されないように封印されています
  • クラスの外部からインスタンス化されるのを防ぐために、プライベートコンストラクタがあります
  • プロパティにプライベートセッターを提供するため、外部から設定することはできません。

それはあなたに次のコードを与えるでしょう:

public sealed class MyError
{
    public static readonly MyError OK = new MyError(0, "OK");

    public static readonly MyError Bad = new MyError(1, "Bad Stuff");

    private MyError(int id, string message)
    {
        this.ID = id;
        this.Message = message;
    }

    public int ID { get; private set; }

    public string Message { get; private set; }
}
于 2013-03-25T17:53:45.023 に答える