C# 7.1

 

一、async Main method

先前在同步的 Main 裡面使用非同步方法,需用 Wait()、GetResult() 等待結果。

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            GetTaskAsync("TIME UP!!!").Wait();
            Console.WriteLine("End");
        }

        static async Task GetTaskAsync(string input)
        {
            for (int i = 3; i > 0; i--)
            {
                Console.SetCursorPosition(0, 0);
                Console.Write(i);
                await Task.Delay(1000);
            }

            Console.WriteLine(nameof(GetTaskAsync) + " - " + input);
        }
    }
}

 

現在可用非同步的 Main 來處理了。

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            await GetTaskAsync("TIME UP!!!");
            Console.WriteLine("End");
        }

        static async Task GetTaskAsync(string input)
        {
            for (int i = 3; i > 0; i--)
            {
                Console.SetCursorPosition(0, 0);
                Console.Write(i);
                await Task.Delay(1000);
            }

            Console.WriteLine(nameof(GetTaskAsync) + " - " + input);
        }
    }
}

 

二、default literal expressions

於 C# 7.1 新增加強可使用 default 關鍵字,

他將代表一個型別的預設值。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = default;
            string b = default;
            bool c = default;

            Console.WriteLine($"a = {a}, b = {b}, c = {c}");
        }
    }
}

執行結果為

 

default 關鍵字可用於方法的輸入參數預設值

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DefaultUse();
        }

        static void DefaultUse(bool a = default)
        {
            Console.WriteLine(a);
        }
    }
}

執行結果為

 

default 關鍵字可用於方法的回傳值

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DefaultUse());
        }

        static int DefaultUse()
        {
            return default;
        }
    }
}

執行結果為

 

default 關鍵字也可用於泛型、委派

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string, bool> a = default;
            if (a is null)
            {
                Console.WriteLine($"{typeof(Func<string, bool>)}'s default value is null");
            }

            List<int> b = default;
            if (b is null)
            {
                Console.WriteLine($"{typeof(List<int>)}'s default value is null");
            }
        }
    }
}

執行結果為

 

三、Inferred tuple element names

於 C# 7.0 開始支援 tuple types

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int id = 1;
            string name = "Tom";
            var pair = (id: id, name: name);

            Console.WriteLine($"id = {pair.id}, name = {pair.name}");
        }
    }
}

執行結果為

 

現在於 C# 7.1 對 tuple types 增加了「元素名稱推斷」功能

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int id = 1;
            string name = "Tom";
            var pair = (id, name);

            Console.WriteLine($"id = {pair.id}, name = {pair.name}");
        }
    }
}

執行結果為

 

四、Pattern matching on generic type parameters

於 C# 7.0 開始支援 Pattern matching,現在 C# 7.1 也可在泛型上使用 Pattern matching 了。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            BMW bmw = new BMW();
            Method(bmw);
        }

        public static void Method<T>(T param)
        {
            switch (param)
            {
                case BMW a:
                    Console.WriteLine("BMW");
                    break;
                case Car b:
                    Console.WriteLine("Car");
                    break;
            }
        }
    }

    class Car { }

    class BMW : Car { }
}

執行結果為