2

次のような多くのプロパティを含むクラスがあります。

public class Update
{
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public string Name { get; set; }
}

の各インスタンスにUpdateは必ずしも各プロパティが設定されているとは限らず、システムの別の部分は、どれが設定されていてどれが設定されていないかを知る必要があります。

私が持っている 1 つのオプションは、すべての値の型を作成することです。Nullableそのため、null値は設定されていないという概念を表します。これは機能しますが、いくつかのプロパティNullable(値の型) を明示的に持つという考えと、参照型であるという理由で null を許容するという考えはあまり好きではありません。クラス定義は見苦しくなり、ヌル チェックが意味的に最適な方法であるとは思えません。

Nullable<T>プロパティに制約のない、T非常によく似たクラスを作成できますIsSet。私は を使用するよりもこのオプションを好みますNullableが、私が提案したオプションよりも優れた代替表現を誰かが持っているかどうかを知りたいです。

4

6 に答える 6

5

ここでは、既存のイディオムに固執する必要があります。組み込みの null 可能性を使用します。

値型と ref 型で null 可能性が異なるという懸念があると思います。あなたの回避策はうまくいくでしょう。しかし、それはあなたが少し得られる単なる化粧品の変更です. この場合、コードを変更するのではなく、自分で変更することをお勧めします。既存の慣習に自分を合わせるようにしてください。

編集:ジェネリックコードで値をオプションにする必要がある場合があります。この場合、いくつかのカスタム オプション タイプを使用する必要があります。経験上、これはかなり使いにくいと言えます。それは私の選択した解決策ではありません。

于 2012-03-14T15:01:48.263 に答える
4

参照型はすでに効果的に null 可能です。使用するint?decimal?stringすべてのプロパティを null にすることができます。

値を null 参照に設定したい場合に問題が発生しstringます - null が実際に設定されている有効な値である場合

あなたは確かに型を書くことができMaybe<T>ますが、私はそうするかどうかはわかりません -おそらくnull を使用するでしょう...他のことは別として、C#イディオムに慣れているコードを読んでいる他の人にとっては、より親しみやすいでしょう。周囲のすべての「アンチヌル」感情 (私は多くの状況で共有してます) に対して、それが最も単純なアプローチである場合があります。

于 2012-03-14T15:01:21.163 に答える
1

Nullable(値型)とそうでない(参照型)のプロパティを持つというアイデアは本当に好きではありません。

参照型は明らかにnull許容です。

string t = null; //is totally valid
于 2012-03-14T15:02:54.207 に答える
1

Nullable はまさにこの目的に使用したいものだと思います。メンバーをプロパティでラップして(すでに行っているように)、クラスに通常の値を「設定されているか」と一緒に外側に表示させ、必要に応じてチェックすることができます。しかし、内部では Nullable を使用します。

于 2012-03-14T15:04:27.170 に答える
0

何か新しいことを提案するには... 限られた数のメンバーを持つ Update のような 1 つのクラスについて話しているだけなら、IsSet だけを使用します。

ただし、この動作を行う同様のクラスが多数ある場合や、プロパティが多数ある場合は、t4 テンプレートを使用することをお勧めします。たとえば、この記事で説明されているように (必要な型または属性の) クラス プロパティを取得し、プロパティのリストに基づいてコードを自動生成できます (必要なデザインを自動的に実装します)。

興味があればもっと説明できます...

于 2012-03-14T15:10:27.183 に答える
0

ここまでの解決策

  • null が有効なオプションでない場合は nullable を使用する
  • null が有効なオプションであるが、指定された値が発生しないことを完全に確信している場合は、デフォルト値を使用します
  • null が有効な値である各プロパティにブール値フラグを使用し、決して使用されないデフォルトに名前を付けることはできません。

例: 数量が設定されている場合、その値が null になることはないため、数量は null 許容である必要があります。

Name が null の可能性があり (名前がない)、Name が決して "" にならないことが確実な場合、Name は "" にデフォルト設定する必要があります。

Name が null 値を持つ可能性があり、デフォルト値が思いつかない場合は、nameSet を使用する必要があるとしましょう。このフラグはデフォルトでは false であり、Name の値を最初に設定するときは、フラグも true に設定する必要があります。

すべてのプロパティを同じ方法で処理したい場合の解決策は、オブジェクトとブール値フラグを含むクラスを作成することです。オブジェクトはプロパティの値を保存し、フラグはプロパティが初期化されたかどうかを保存しますが、必要がない場合でもブール値のフラグを作成するため、これは好きではありません。

于 2012-03-14T15:16:09.417 に答える