web-dev-qa-db-ja.com

C#7.0の機能の重要性を破棄しますか?

新しいC# 7.0機能、私はdiscard機能で立ち往生しました。それは言う:

破棄は、割り当てることはできても、読み取ることができないローカル変数です。つまり、「書き込み専用」のローカル変数です。

次に、例を示します。

if (bool.TryParse("TRUE", out bool _))

これが有益になる実際のユースケースは何ですか?私がそれを通常の方法で定義したとしたら、どういうことか、と言う:

if (bool.TryParse("TRUE", out bool isOK))
18
rahulaga_dev

discardsは基本的に、生成されるコードの目的に関係のないローカル変数を意図的に無視する方法です。これは、値を返すメソッドを呼び出すようなものですが、実行する基本的な操作のみに関心があるため、その出力を、呼び出し側メソッドで定義されたローカル変数に割り当てません。たとえば、次のようになります。

public static void Main(string[] args)
{
    // I want to modify the records but I'm not interested
    // in knowing how many of them have been modified.
    ModifyRecords();
}

public static Int32 ModifyRecords()
{
    Int32 affectedRecords = 0;

    for (Int32 i = 0; i < s_Records.Count; ++i)
    {
        Record r = s_Records[i];

        if (String.IsNullOrWhiteSpace(r.Name))
        {
            r.Name = "Default Name";
            ++affectedRecords;
        }
    }

    return affectedRecords;
}

実際、私はそれを表面的な機能と呼んでいます...それは、コードを明確に、読みやすく維持しやすいように保つのに役立つ設計時機能(とにかく破棄された変数に関する計算が実行されます)であるという意味です。

あなたが提供したリンクに示されている例は、ちょっと誤解を招くものです。 StringBooleanとして解析しようとすると、解析した値をコードのどこかで使用したい場合があります。それ以外の場合は、StringBoolean(たとえば、regular expressionのテキスト表現に対応しているかどうか...単純なif文は、大文字小文字が適切に処理された場合に機能します)。これは決して起こらないとか、それが悪い習慣だと言ったりするのではなく、作成する必要のある最も一般的なコーディングパターンではないというだけです。

反対に この記事 で提供されている例は、この機能の潜在能力を実際に示しています。

public static void Main()
{
    var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);
    Console.WriteLine($"Population change, 1960 to 2010: {pop2 - pop1:N0}");
}

private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2)
{
    int population1 = 0, population2 = 0;
    double area = 0;

    if (name == "New York City")
    {
        area = 468.48;

        if (year1 == 1960) {
            population1 = 7781984;
        }

        if (year2 == 2010) {
            population2 = 8175133;
        }

        return (name, area, year1, population1, year2, population2);
    }

    return ("", 0, 0, 0, 0, 0);
}

上記のコードを読んだところ、discardsC#の最新バージョンで導入された他のパラダイムと比較して、シナジーが高いようです タプル分解 など。


Matlabプログラマーにとって、discardsは非常に長い間(おそらく最初から)プログラミング言語がそれらを実装しているため、新しい概念とはほど遠いですが、確かには言えません)。公式ドキュメントはそれらを次のように説明しています(リンク ここ ):

fileparts関数 から3つの可能な出力をすべて要求します。

helpFile = which('help');
[helpPath,name,ext] = fileparts('C:\Path\data.txt');

現在のワークスペースには、filePartからの3つの変数、helpPath、name、extが含まれています。この場合、変数は小さいです。ただし、一部の関数は、より多くのメモリを使用する結果を返します。これらの変数が必要ない場合は、システムのスペースを浪費します。

チルダ(〜)を使用して最初の出力を無視します。

[~,name,ext] = fileparts(helpFile);

唯一の違いは、Matlabでは、出力引数が柔軟であり、呼び出し元から要求された出力引数の数とどれかを知ることができるため、破棄された出力の内部計算は通常スキップされます。

23

多くの場合、これらの行に沿ってコードを実行しました。

TextBox.BackColor = int32.TryParse(TextBox.Text, out int32 _) ? Color.LightGreen : Color.Pink;

これは、スタンドアロンのものではなく、より大きなデータのコレクションの一部になることに注意してください。アイデアは、入力しているデータの各フィールドの有効性について即座にフィードバックを提供することです。

私は緑や赤の色ではなく、明るい緑やピンクを使用しています。後者の色は、テキストが少し読みにくくなるほど暗く、明るいバージョンの意味は完全に明白です。

(場合によっては、Color.Yellowを使用して無効なフラグを設定することもできますが、完全に無効でもありません。パーサーが分数を受け入れ、フィールドに現在「2 1」が含まれているとします。これは「2 1/2インチなので、ゴミではありませんが、どちらも有効ではありません。)

3
Loren Pechtel

破棄が主に_Task<T>_を返すメソッドに対して使用されるのを見ましたが、出力をawaitしたくありません。

以下の例では、SomeOtherMethod()の出力を待ちたくないので、次のようにします。

_//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
Example();
_

これを除いて、次の警告が生成されます。

CS4014この呼び出しは待機されないため、現在のメソッドの実行は、呼び出しが完了する前に続行されます。呼び出しの結果に「待機」演算子を適用することを検討してください。

この警告を緩和し、コンパイラーが私たちが何をしているかを知っていることを本質的に確認するには、破棄を使用できます。

_//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
_ = Example();
_

警告はもうありません。

1
Zze