15

F#のマントラでは、の内臓回避とその同類があるようnullですNullable<T>。代わりに、オプションタイプを使用することになっています。正直なところ、違いはわかりません。

  • F#オプション型についての私の理解は、通常の値、またはのいずれかを含むことができる型を指定できることですNone。たとえば、anは、に加えて、が持つことがOption<int>できるすべての値を許可します。intNone

  • C#null許容型についての私の理解は、通常の値、またはのいずれかを含むことができる型を指定できることですnull。たとえば、Nullable<int>akaは、に加えて、が持つことがint?できるすべての値を許可します。intnull

違いは何ですか?NullableOption、、nullとで語彙を置き換えれNoneば、基本的に同じことができます。何が大騒ぎnullですか?

4

6 に答える 6

21

Option<'T>F#オプションは一般的であり、任意のタイプに対して作成できます'T

Nullable<T>ひどく奇妙なタイプです。これは構造体にのみ適用でき、Nullable型自体は構造体ですが、それ自体に適用することはできません。したがって、を作成することはできませんがNullable<Nullable<int>>、を作成することはできますOption<Option<int>>。彼らはそれをのために機能させるためにいくつかのフレームワークの魔法をしなければなりませんでしたNullable。いずれにせよ、これはNullablesの場合、型がクラスか構造体かを事前に知る必要があり、クラスの場合はNullableではなくnullを使用する必要があることを意味します。それは醜い漏れのある抽象化です。データベースドメインで処理する「intまたはnovalue」オブジェクトがあるのが一般的であると思うので、これはデータベースの相互運用性にあるようです。

私の意見では、.Netフレームワークはnullと.netに関しては醜い混乱Nullableです。F#'は、をOption使用することで混乱を助長するか、null / (相互運用に絶対に必要なNullable場合を除く)を避けてsを使用したクリーンなソリューションに焦点を当てることを提案することで混乱から救うと主張できます。あなたは両方の意見を持つ人々を見つけることができます。Option

あなたも見たいかもしれません

nullのない言語の最良の説明

于 2012-06-21T21:33:00.433 に答える
7

すべての.NET参照型は、nullであるかどうかに関係なく、この余分な意味のない値を持つ可能性があるため、可能性があり、それを確認する必要があります。また、「何もない」の表現としてNullable使用されるため、多くのことが可能になると思います。 null(F#が行う)すべての奇妙さを排除し、明示的に「何もない」可能性を要求する感覚。Option<_>それをします。

于 2012-06-21T22:14:14.987 に答える
7

違いは何ですか?

F#を使用すると、型を型にするかどうかを選択できます。そうする場合は、型の有無を確認して明示的にするoptionように促します。NoneNone

C#は、すべての参照型に許可nullを強制し、をチェックすることを推奨しませんnull

したがって、これはデフォルトの違いにすぎません。

NullableとOption、nullとNoneで語彙を置き換えれば、基本的に同じことができます。ヌルをめぐる騒ぎは何ですか?

SML、OCaml、Haskellのような言語が示しているように、削除nullすると実際のコードから多くの実行時エラーが削除されます。の元の作成者がそれを彼の「 10億ドルの間違いnull」とさえ説明する程度まで。

于 2012-06-22T15:13:44.987 に答える
4

使用する利点optionは、変数に値を含めることができないことを明示的にするのに対し、null許容型は暗黙的に残すことです。次のような定義が与えられます:

string val = GetValue(object arg);

型システムは、valがnullになる可能性があるかどうか、またはargがnullの場合に何が起こるかを文書化しません。これは、呼び出し元と呼び出し先の仮定を検証するために、関数の境界で繰り返しチェックを行う必要があることを意味します。

パターンマッチングに加えて、オプションタイプを使用するコードを静的にチェックして、両方のケースが処理されていることを確認できます。たとえば、次のコードは警告を表示します。

let f (io: int option) = function
| Some i -> i
于 2012-06-21T21:34:39.697 に答える
2

OPが言及しているように、オプション型を伝達するときにオプションまたはnullableという単語を使用することには意味上の違いはあまりありません。

オプション以外nullの型を表現したい場合、組み込みシステムの問題が明らかになります。

C#では、すべての参照型を null。したがって、組み込みを使用しnullてオプションの値を表現した場合、開発者が意図したかどうかに関係なく、すべての参照型は強制的にオプションになります。開発者がオプション以外の参照型を指定する方法はありません(C#8まで)。

したがって、問題はの意味的な意味ではありませんnull。問題はnull、参照型によって乗っ取られることです。

C#開発者として、組み込みシステムを使用してオプションを表現できればと思いnullます。そして、それはまさにC#8がnull許容の参照型で行っていることです。

于 2019-08-28T00:31:21.823 に答える
0

1つの違いは、の場合Nullable<T>、Tはユースケースを劇的に減らす構造体にしかなり得ないということです。

また、この回答を必ずお読みください:https ://stackoverflow.com/a/947869/288703

于 2012-06-21T21:16:04.113 に答える