C# 7.2
一、Non-trailing named arguments
在 C# 4 支援了 named and optional arguments,
但如果 non named arguments 和 named arguments 同時存在時,
則 named arguments 只能排在所有的 non named arguments 的後面。
如下 error 範例
修正為 named arguments 結尾
using System;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Show(3, "Tom", health: true);
Console.ReadKey();
}
static void Show(int id, string name, bool health)
{
Console.WriteLine(String.Format("id = {0}, name = {1}, health = {2}", id, name, health));
}
}
}
而於 C# 7.2 加強了 named arguments 這部份,
named arguments 不用排在所有的 non named arguments 的後面了。
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Show(id: 3, "Tom", health: true);
}
static void Show(int id, string name, bool health)
{
Console.WriteLine($"id = {id}, name = {name}, health = {health}");
}
}
}
執行畫面為
二、Leading underscores in numeric literals
在 C# 7.0 開始支援「數字之間底線分隔」功能,
但無法在數字最大位的前面加上底線。
但在 C# 7.2,已可在數字最大位的前面加上底線了。
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int a = 0b_1010;
Console.WriteLine(a);
}
}
}
執行結果為
三、private protected access modifier
internal 修飾詞可以讓我們限制該類別只能被同一個組件中的使用,
而 protected 修飾詞則可以讓我們限制該類別只能在同類別或衍生類別中使用,
如果想要同時達到兩種需求呢?則可以使用新增的 private protected 修飾詞。
目前 C# 7.2 所支援的各種修飾詞組合的存取層級如下
C# 修飾詞 | 同組件中 | 其他組件 | |||
---|---|---|---|---|---|
同類別 | 衍生類別 | 非同類別 | 衍生類別 | 非同類別 | |
public | ✔ | ✔ | ✔ | ✔ | ✔ |
private | ✔ | ✘ | ✘ | ✘ | ✘ |
internal | ✔ | ✔ | ✔ | ✘ | ✘ |
protected | ✔ | ✔ | ✘ | ✔ | ✘ |
protected internal | ✔ | ✔ | ✔ | ✔ | ✘ |
private protected | ✔ | ✔ | ✘ | ✘ | ✘ |
四、Readonly Ref (in 參數)
參數修飾詞「in」,其同時具有 ref 特性與 readonly 特性。
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Show(3, "Tom");
}
static void Show(in int id, string name)
{
//CS8331:Cannot assign to variable 'in int' because it is a readonly variable
//id = 100;
name = "Bill";
Console.WriteLine($"id = {id}, name = {name}");
}
}
}
執行結果為
五、Conditional ref expression
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string yes = "YES";
string no = "NO";
ref string result = ref (100 > 1 ? ref yes : ref no);
Console.WriteLine(result);
}
}
}
執行結果為
參考資料: