16

私はしばしば自分がやっていることに気づきます:

foo = foo ?? x;

できない理由:

foo ??= x;

編集:それが言語の一部ではないことは知っています...私の質問は「なぜですか」ですか?「foo」を繰り返す必要性は、不快であり、エラーが発生しやすい可能性があると思います。それは次のように醜く見えます:

foo = foo + x;
4

14 に答える 14

19

考えてみると、

foo = foo ?? x 

本当にただ

foo = foo != null ? foo : x

そしてその時点で、+= の類推は崩壊し始めます。

于 2009-02-17T18:07:09.640 に答える
14

そのような演算子が存在しない理由はありませんが、言語の複雑さが増したことは、わずかではありますが、利点を上回っているのではないかと思います (これは「非常にわずか」と見なします)。

基本的に、言語への追加には、クリアしなければならない非常に高いハードルがあります。あなたはこれをかなり頻繁に使うとおっしゃっていますが、実際にはどのくらいの頻度ですか? 便利だと??は思いますが、それほど頻繁に使うとは言えません。

于 2009-02-17T18:07:51.230 に答える
14

一般に、C# 言語設計チームは、新しい構文の追加について保守的です。彼らは、言語への追加の価値は、言語の複雑さの増加のコストと比較検討する必要があると言います.

Peter Hallam は、しばらくの間 C# コンパイラの開発リーダーであり、C# 言語設計チームのメンバーでもありました。彼は、 Yardstickと呼ばれる新しい機能を測定する方法について書いていますが、言語機能よりもインタラクティブな GUI 機能に重点を置いていました。

このテキストは、次の質問に特に関連しています??=

多くの場合、正しい設計上の決定は、何も変更しないことです。これはおそらく、C# 言語設計会議で Anders を見て学んだ最も重要な教訓です。多くの場合、言語の特定の領域が取り上げられ、実際に改善できる可能性があるように見えます。ユーザーの一般的なコーディング エラーを防止したり、特定の問題領域での言語の使いやすさを改善したりできます。そして、問題に対処するためのすべてのオプションを徹底的に考えた後、答えは何もしないことです....何もしません! 問題は有効であり、状況を改善するために何かを追加できるように見えますが、慎重に検討した後、ソリューションの利益以上の費用がかからない問題に対処する方法はありません. Anders が行った最も重要で価値のある決定の多くは、付加価値が複雑さを正当化しない限り、言語に複雑さを加えないという決定です。境界線上のケースでは、彼はほとんどの場合、限界的なものを追加するよりも何も選択しません。

参考文献:

于 2009-02-17T18:57:46.647 に答える
9

??オペランドの値で「演算」を行うという意味で「演算子」ではありません。あなたはそれを単なる言語構造と見なすべきです。

あなたが持っていたとします:

node = node.next;

次に、次のことができるようになりたいですか?

node .= next;

??=存在しないのと同じ理由で存在しないと思います.=

+=さらに、 、 などの単項演算子*=には、アセンブリ レベルで直接対応する演算子があります。擬似アセンブリ:

add reg0, 1
mul reg1, 5

これらの演算子が存在するのは「自然」です。

于 2009-02-17T18:45:24.900 に答える
5

この操作を実行するオペレーターはありません。ただし、これは言語の将来のバージョンに対する興味深い提案です。??合体演算子 の主なユースケースは Nullable 型であり、次のように値を取得するため、これまで含まれていなかったと思います。

int? testValue;

return testValue ?? 0;

あなたの例のような割り当て操作ではなく。また、一方+=は常に foo の値を変更することが保証されていますが+= 0??=そうはなりません。

于 2009-02-17T18:06:09.017 に答える
5

??=toのアナロジー+=が意味があるかどうかを議論しているときに、誰もが見落としている、もっと単純な答えがあります。

質問: なぜfoo ??= x;C# でできないのですか?

回答:すべての機能はマイナス 100 ポイントから始まるため、機能は最初は存在せず、誰かがそれらを実現する必要があり、おそらくその機能を追加した場合、それらのリソースは、顧客ベースにより大きな全体的な利益をもたらす何かに費やされています:

... 機能がどのように機能するかを設計するために必要なすべての時間と労力を考え、すべての境界条件を明確にし、コードを作成し、自動テストを作成し、... ドキュメントとヘルプ テキストを作成し、保守を続けます。機能の予想される有効期間 (この場合はおそらく永久) のコード、テスト、およびドキュメント。これらすべてのリソースを、顧客ベースにより大きな全体的な利益をもたらす何かに費やすことができたでしょうか? (それに対する答えは常に「はい」です。誰もが、義理の妹と一緒に、「修正する代わりに、このばかげた機能にずっと時間を費やしたなんて信じられません...」という文を完成させる方法を見つけることができます。 )

于 2009-02-17T19:04:00.783 に答える
3

??を使用する理由はあまりわかりません。変数を自己割り当てる演算子。

おそらくfoo、たまたまあるデータベース値に基づいて設定しNULLているので、??を使用する方が理にかなっています。その割り当て中の演算子(?? =の必要性を排除します):

foo = (int?)rows["possiblyNullCount"] ?? 0;

とは対照的に:

foo = (int?)rows["possiblyNullCount"];
foo = foo ?? 0;
于 2009-02-17T18:21:48.403 に答える
3

Update 2017 : Null 合体代入は、C# 言語設計チームによって検討中のアクティブな提案です。https://github.com/dotnet/csharplang/issues/34で投票するか、ディスカッションに参加してください。

于 2018-06-13T15:51:36.920 に答える
2

あなたが求めているものとは正確には異なりますが(??=ではありません)...おそらく拡張メソッドを活用できます。

static void Main(string[] args)
{
    object foo = null;
    object x = "something";
    Console.WriteLine(foo.NullToValue(x));
}

public static class ObjectExtensions
{
    public static object NullToValue(this object obj, object value)
    {
        return obj != null ? obj : value;
    }
}

これが機能しない可能性のある方法を考えるのに十分な時間を費やしたわけではありませんが、私のサンプル アプリケーションでは臭いテストに合格しているようです...

于 2009-02-17T18:37:59.067 に答える
2

私もそれが恋しいです-Rubyは私を台無しにしました。これは、式で使用できる同様の構成です (副作用にアレルギーがない場合)。

foo ?? foo = x;

次のように:

return foo ?? foo = x;

または (説明のみ!):

DoStuff( foo ?? foo = x );

プロパティ ゲッターの外でこのパターンを使用することは、おそらく良い考えではありません。

于 2009-02-17T22:24:56.617 に答える
2

主な理由は、+=、-= などは、C & C++ との互換性を維持するための後付けとして追加されたためです。(*) ?? は C または C++ の一部ではないため、余分な演算子を追加する必要はありませんでした。

(*) C++ では、クラスの演算子を定義する場合、通常は operator+=() を定義し、それに基づいて operator+() を実装することに注意してください。(これは一般的に最も効率的な方法です)。ただし、C# では、operator+ を実装すると、コンパイラは oper+ に基づいて operator+= を自動的に追加します。これが、私が += 演算子が後付けされたものであると言う理由です。

于 2009-02-17T18:09:04.690 に答える
1

そのスタイルのステートメントは、プロパティゲッターからの遅延読み込みのように感じます。その場合、私はこの構文を選択します

private Foo myFoo;
public Foo MyFoo
{
    get
    {
        return myFoo ?? (myFoo = new Foo());
    }
}
于 2009-02-17T18:19:49.860 に答える
-2

C# にはそのような ??= 演算子がないためです。

+= は、異なる構文で表される 2 つの演算子のように見えるかもしれませんが、1 つの演算子にすぎません。

于 2009-02-17T18:05:06.540 に答える