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 { }
}
執行結果為