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);
        }
    }
}

執行結果為

 

參考資料:

Access Modifiers (C# Reference)