C#のは本当に強くなり、よりセマンティックになっています

1つ:背景

1.ストーリーを語る

最近、C#7がだんだんわかりにくくなっていることに気づきました。一見派手に見えますが、落ち着いてよく読んでみると、どんどん短くなっていて、セマンティックでもあります。かっこいい言葉なので、この記事で簡単に話しましょう。

2:使用方法はC#7より前です

1.タイプの互換性チェック

C#を学んだ友人は、それが何であるかを知っていると思います。彼らはそれをasと比較することがよくあります。前者は一般に互換性テストに使用され、後者は一般に互換性変換に使用されます。ここで例を示します。


        static void Main(string[] args)
        {
            object slot = new Slot() { ClothesName = "上衣" };

            if (slot is Slot)
            {
                Console.WriteLine($"slot is {nameof(Slot)}");
            }

            if (slot is IComparable)
            {
                Console.WriteLine($"slot is {nameof(IComparable)}");
            }
        }

        public class Slot : IComparable
        {
            public string ClothesName { get; set; }

            public int CompareTo(object obj) {return 0;}
        }

この例からわかるように、オブジェクトタイプのスロットとSlot、IComparableはタイプ互換であり、非常に単純です。

2.後悔

ただし、実際のコーディングでは、後続のプロセスで多くの友人がスロットインスタンスを使用すると思います。上記の例では、スロットタイプの検出に使用する場合でも、オブジェクトスロットを強制的にスロットタイプに変換します。 、非常に奇妙なテストと別の強制転送を行いました。次のコード:


            if (slot is Slot)
            {
                var query = (Slot)slot;
                Console.WriteLine($"slot is {nameof(Slot)}, ClothesName={query.ClothesName}");
            }

何か問題がない限り、そのようなコードを書くだけです。2つのステップを1つのステップに変換するために直接使用してみませんか?次のようにコードを変更します。


            var query = slot as Slot;

            if (query != null)
            {
                Console.WriteLine($"slot is {nameof(Slot)}, ClothesName={query.ClothesName}");
            }

これにより、がasに置き換えられ、結果として空のシェルフになるシナリオが数多く発生しました。asの機能を組み込むことができる場合は、????????、これを早急に強化する必要があると思います。

3:使い方はC#7以降

最後に、C#7の後、isに大地を揺るがす構文上の砂糖の変更が加えられたため、一見理解できなくなります????????????、例を挙げて1つずつ説明します。

1.isと複合型/単純型の組み合わせ

ここで、newを使用して、2つの変換の問題を解決する方法を見てみましょう。次のコードです。


            object slot = new Slot() { ClothesName = "上衣" };

            if(slot is Slot query)
            {
                Console.WriteLine($"slot is {nameof(Slot)}, ClothesName={query.ClothesName}");
            }

このコードの表面的な意味は次のとおりです。最初に使用するのは、スロットがスロットタイプであるかどうかを確認し、そうである場合は、スロットタイプのクエリ変数に割り当てます。ハハ、興味深いです。前述のとおりかどうかを確認するには、デコンパイラツールを使用します。

  • ILSpyのコンパイル解除

  • DnSpyのコンパイル解除

ご覧のとおり、実際には、コンパイラは復元にasを使用しますが、コードの流暢さの観点からは、ILSpyの方が優れていますか????????

クラスインスタンスとの比較に加えて、int、string、tuple ...と比較することもできます。コードは、次のとおりです。


            object e = 150;

            //字符串比较
            if (e is "hello") { }

            //整形比较
            if (e is 10) { }

            //tuple 比较
            if (e is (10, 20)) { }

2.isとnullの組み合わせ

特定のフィールドがnullかどうかを判断するためにsqlを作成するときは、通常、次のように作成します。username is nullまたはusername is not null、ハハ、この作成方法もC#に導入されています。興味深いので、コードに進みましょう。


            object e = 150;

            if (e is null)
            {
                Console.WriteLine("e is null");
            }

            if (e is not null)
            {
                Console.WriteLine("e is not null");
            }

C#でこのようなセマンティック書き込みを見るのは少し慣れていないのですか、なぜSQLでは通常のように使用されているのですか?実際、デコンパイルには何の問題もありません。==の判断、次のコードだけです。

3. isとand、またはの組み合わせ

これで、通常はifステートメントに配置されることがわかりました。ifステートメントに含まれているため、多くの論理的判断が必要です。これには、との組み合わせ、または非常に複雑な論理関係を構築する必要があります。目がくらむことはありません。


            object e = 150;

            if (e is >= 100 and <= 200)
            {
                Console.WriteLine($"e={e} 果然 大于 100 并且 小于 200");
            }

            if (e is 100 or 150 or 200)
            {
                Console.WriteLine($"e={e} 是在 100,150,200 三个数字中");
            }

            if (e is not null and not "")
            {
                Console.WriteLine($"e={e},模拟 !string.IsNullOrEmpty 功能");
            }

あなたは決勝戦を見ることができます:e is not null and not ""実際!string.IsNullOrEmptyにはと同等です、それは面白いですか?

ここで注意しなければならないのは、上記のeはコンパイラレベルのオブジェクトタイプであるということです。コンパイラレベルでintを使用する場合は、次の図に示すように、例1の方法で変換する必要があります。

4.isとvarの組み合わせ

isとvarを組み合わせると、さらに多くなりますか????????、if判定の過程で、次のコードの一時変数を生成できます。


            int e = 150;

            if (e is var i && i >= 100 && i <= 200)
            {
                Console.WriteLine($"e={i} 果然 大于 100 并且 小于 200");
            }

上記のコードのiは一時変数です。後で実行するすべてのビジネスロジックは、一時変数iに基づいています。本質を理解していなくても問題ありません。プロジェクトの例を示します。

当社は洗濯物の洗浄の自動化に取り組んでおり、オフラインの伝送ラインで服を自動的に吊るし、それを取り出して、服を混ぜ合わせて一致させる找到 刚好挂了一件裤子L && 一件上衣L && 总衣服个数=2 的 挂孔号必要があります。たとえば、理解できない場合は、コードを書いて話すだけです。


class Program
    {
        static void Main(string[] args)
        {
            var slotList = new List<Slot>()
            {
                new Slot()  {SlotID=1, ClothesID=10,ClothesName="上衣", SizeName= "L" },
                new Slot()  {SlotID=1, ClothesID=20,ClothesName="裤子", SizeName= "M" },
                new Slot()  {SlotID=1, ClothesID=11,ClothesName="皮带", SizeName= "X" },
                new Slot()  {SlotID=2, ClothesID=30,ClothesName="上衣", SizeName= "L" },
                new Slot()  {SlotID=2, ClothesID=40,ClothesName="裤子", SizeName= "L" }
            };

            //找到 刚好挂了一件裤子L & 一件上衣L  & 总衣服个数=2  的 挂孔号
            var query = slotList.GroupBy(m => m.SlotID).Where(m =>
                                                                      m.Where(n => n.SizeName == "L").ToList() is var clothesList &&
                                                                      clothesList.Count(k => k.ClothesName == "裤子") is 1 &&
                                                                      clothesList.Count(k => k.ClothesName == "上衣") is 1 &&
                                                                      m.Key == 2
                                                              )
                                                    .ToDictionary(k => k.Key, v => v.ToList());
        }

        public class Slot
        {
            public int SlotID { get; set; }

            public int ClothesID { get; set; }

            public string ClothesName { get; set; }

            public string SizeName { get; set; }
        }
    }

上記のコードに  m.Where(n => n.SizeName == "L").ToList() is var clothesList注目してください。ここにすべての尺寸Lを格納するclothesList一時変数があります。後続の取得はこのclothesListに基づいていますが、取得速度は大幅に向上しません~~~

4:まとめ

の機能強化はずっと前に登場していたはずだったのですが、ようやく完成しました。ますます人道的になり、キーボードのストローク数が減り、髪が落ちず、第二春も始まって​​います。繰り返しますが、C#Dafa ????????。

おすすめ

転載: blog.csdn.net/sD7O95O/article/details/108906268