38

C#でユーザーからパラメータなしのコンストラクタを隠すことは可能ですか?

常にパラメーター付きのコンストラクターを使用するように強制したい

たとえば、この Position 構造体

public struct Position
{
    private readonly int _xposn;
    private readonly int _yposn;
    
    public int Xposn
    {
        get { return _xposn; }
    }

    public int Yposn
    {
        get { return _yposn; }
    }

    public Position(int xposn, int yposn)
    {
        _xposn = xposn;
        _yposn = yposn;
    }        
}

x 座標と y 座標を指定して、ユーザーが位置を新しくできるようにしたいだけです。

ただし、パラメーターなしのコンストラクターは常に使用できます。

私はそれをプライベートにすることはできません。または、パブリックとして定義することもできます。

私はこれを読みました: .NET で構造体の既定のコンストラクターを定義できないのはなぜですか?

しかし、それは本当に役に立ちません。

これが不可能な場合 - 渡された位置に値があるかどうかを検出する最良の方法は何ですか?

各プロパティ フィールドを明示的にチェックしますか? よりスマートな方法はありますか?

4

4 に答える 4

38

いいえ、これはできません。あなたが言ったように、以前にも同様の質問がありました-そして私はあなたがそれをすることができないという答えはかなり明白だと思いました。

構造体のプライベートパラメーターなしコンストラクターを作成でき ますが、C#では作成できません。ただし、それを行っても実際には役に立ちません。簡単に回避できるためです。

MyStruct[] tmp = new MyStruct[1];
MyStruct gotcha = tmp[0];

これは、コンストラクターを呼び出さなくても、MyStructのデフォルト値(「すべてゼロ」の値)になります。

構造体にValidateメソッドを簡単に追加して、パラメーターとして受け取るたびにそれを呼び出すことができます。

于 2009-02-11T07:33:16.933 に答える
5

いいえ、それを隠すことはできません。構造体はゼロ引数のコンストラクターを再定義できないため、その可視性を再定義することはできません。

于 2009-02-11T03:47:53.777 に答える
3

構造体は文字通り、メモリがどのように配置されるかの宣言です。

オブジェクトを使用する場合でも、null であるかどうかに関係なく、オブジェクト ポインターは宣言されます。

コンストラクターを非表示にできない理由は、構造体が内部的にこれを行う必要があるため、CLR がコンストラクターを作成できることを要求するためです。

この構造体をオブジェクトに変換して、このタスクを達成できます。または、静的分析を使用して、使用する前に初期化されていることを確認しますか?

struct point
{
   int xpos;
   int ypos;
}

不変オブジェクトのグーグルを持ってください。これはあなたの後であるようです。彼らはこの機能を (C# 4 ではなく) 言語自体に追加しようとしていると思います。これは一般的な要件であるためです。ここに構造体の特定の必要性はありますか?

于 2009-02-11T03:47:34.217 に答える
3

パラメーターのないプライベート コンストラクターを使用して構造体を作成したり、パラメーターのないコンストラクターを宣言したりすることはできません。クラスに変更する必要があります。構造体では、パラメーターなしのコンストラクターを宣言することはできません。

MSDNの構造体チュートリアルから:

構造体はコンストラクターを宣言できますが、パラメーターを取る必要があります。構造体のデフォルト (パラメーターなし) コンストラクターを宣言するとエラーになります。構造体メンバーは初期化子を持つことができません。構造体メンバーをデフォルト値に初期化するために、デフォルト コンストラクターが常に提供されます。

MSDNのC# 仕様から:

11.3 クラスと構造体の違い

構造体は、いくつかの重要な点でクラスと異なります。

  • 構造体は値型です (セクション 11.3.1)。
  • すべての構造体型はクラス System.ValueType (セクション 11.3.2) から暗黙的に継承されます。構造体型の変数への割り当ては、割り当てられている値のコピーを作成します (セクション 11.3.3)。
  • 構造体のデフォルト値は、すべての値型フィールドをデフォルト値に設定し、すべての参照型フィールドを null に設定することによって生成される値です (セクション 11.3.4)。ボックス化およびボックス化解除操作は、構造体型とオブジェクトの間の変換に使用されます (セクション 11.3.5)。
  • これの意味は、構造体では異なります (セクション 11.3.6)。
  • 構造体のインスタンス フィールド宣言に、変数初期化子を含めることは許可されていません (セクション 11.3.7)。
  • 構造体は、パラメーターなしのインスタンス コンストラクターを宣言することはできません (セクション 11.3.8)。
  • 構造体でデストラクタを宣言することは許可されていません (セクション 11.3.9)。
于 2009-02-11T05:42:52.083 に答える