1. 程式人生 > 其它 >C# 6.0 功能預覽 (一)

C# 6.0 功能預覽 (一)

一、索引的成員和元素初始化

1.1 原始初始化集合 Dictionary

1.2 鍵值初始化集合 Dictionary

1.3 運算子 $ 初始化集合 Dictionary

二、自動屬性的初始化

一不小心發現 C# 已經到 6.0 了,現在專案中使用的還是 4.0,這節奏,完全跟不上啊!

雖然自己也沒有使用過 6.0,既然看到了,就拿出來和園有分享一下。

看到了@dotnetgeek的評論,非常感謝,認為是給我這樣浮躁的人善意的警告,不應該盲目跟風追新,應該老老實實把現在的搞清楚,萬變不離其宗 我發現你是一個微軟黑粉,語言的更新僅僅是多了一些特性,你懂C#4.0就可以很輕鬆的掌握6.0,這不是一個新技術。很多人都說跟不上,我不以為然,比如以前的委託,到了C#新版本出現了Action<T>之類的,咋一看,以為是新東西,但是經過了解之後,就知道是語法糖,所以,你懂的話,根本就不怕更新快,相反,反而會提高你的程式設計效率

一、索引的成員和元素初始化

1.1 原始初始化集合 Dictionary

思考一下,下面的單元測試

通過集合初始化器給一個集合賦值

        [TestMethod]
        public void DictionaryIndexWithoutDotDollar()
        {
            Dictionary<string, string> builtInDataTypes = new Dictionary<string, string>()
            {
                {"Byte", "0 to 255"},
                {"Boolean", "True or false."},
                {"Object", "An Object."},
                {"String", "A string of Unicode characters."},
                {"Decimal", "±1.0 × 10e-28 to ±7.9 × 10e28"}
            };
        }

1.2 鍵值對始化集合 Dictionary

儘管上面的程式碼有些隱晦,但他還是一個鍵值對集合。如果語法為<index> = <value>的形式,會更加清晰,容易理解。在 C# 6.0 中,就可以通過 C# 物件初始化器和一個新的索引成員語法來初始化。

下面是基於整型元素的初始化:

            var cppHelloWorldProgram = new Dictionary<int, string>

            {

                [10] = "main() {",

                [20] = "    printf("hello, world")",

                [30] = "}"

            };

            Assert.AreEqual(3, cppHelloWorldProgram.Count);

注意:儘管例項化程式碼使用整數作為索引,但 Dictionary<TKey,TValue> 是支援任何型別作為索引(只要該索引支援 IComparable<T>)。

下面介紹一個使用字串作為索引型別,並使用索引成員初始化器指定元素值

            Dictionary<string, string> builtInDataTypes =
                new Dictionary<string, string>
                {
                    ["Byte"] = "0 to 255",
                    // ...
                    // Error: mixing object initializers and
                    // collection initializers is invalid
                    // {" Boolean", "True or false."},
                    ["Object"] = "An Object.",
                    ["String"] = "A string of Unicode characters.",
                    ["Decimal"] = "±1.0 × 10e?28 to ±7.9 × 10e28"
                };

1.3 運算子 $ 初始化集合 Dictionary

隨著新的索引成員初始化器出現的還有一個新運算子 “$”(難道他的靈感來自於ps,自己瞎猜的)。字串索引成員語法是提供給基於字串索引使用的。使用該新語法,更像是動態成員呼叫,而非上面字串的表示。

下面是一個例子       

        [TestMethod]
        public void DictionaryIndexWithDotDollar()
        {
            Dictionary<string, string> builtInDataTypes =
                new Dictionary<string, string>
                {
                    $Byte = "0 to 255",   // Using indexed members in element initializers
                    // ...
                    $Boolean = "True or false.",
                    $Object = "An Object.",
                    $String = "A string of Unicode characters.",
                    $Decimal = "±1.0 × 10e?28 to ±7.9 × 10e28"
                };
            Assert.AreEqual("True or false.", builtInDataTypes.$Boolean);
        }

為了理解運算子“$”,請留意呼叫的 AreEqual 方法。有沒有注意到 builtInDataTypes 變數呼叫 dictionary 的成員 “$Boolean”,但是在 dictionary 中沒有 “Boolean” 成員。因為運算子 “$” 呼叫 dictionary 中的索引成員,就等同於 buildInDataTypes["Boolean"],所以使用運算子 “$” 時,不需要明確指出索引。

作為基於字串的運算,編譯時沒有驗證字串索引在 dictionary 中是否存在。也就是說,只要是合法的C#成員(區分大小寫)在運算子 “$”($+”C#成員”)。

更加令人意外的索引成員語法是,考慮了字串索引在若弱型別資料(如:XML、JSON、CSV、甚至是資料庫查詢)種的優勢。下面是一個,使用Newtonsoft.Json框架很方便的使用字串索引成員的例子。

[TestMethod]
        public void JsonWithDollarOperatorStringIndexers()
        {
            // Additional data types eliminated for elucidation
            string jsonText = @"
                {
                  'Byte':  {
                    'Keyword':  'byte',
                    'DotNetClassName':  'Byte',
                    'Description':  'Unsigned integer',
                    'Width':  '8',
                    'Range':  '0 to 255'
                            },
                  'Boolean':  {
                    'Keyword':  'bool',
                    'DotNetClassName':  'Boolean',
                    'Description':  'Logical Boolean type',
                    'Width':  '8',
                    'Range':  'True or false.'
                              },
                }";
            JObject jObject = JObject.Parse(jsonText);
            Assert.AreEqual("bool", jObject.$Boolean.$Keyword);
        }

最後需要注意一點,例子可能不是很明顯,上面運算子 “$” 的語法只適用於索引是字串型別(如Dictionary<string,…>)

二、自動屬性初始化

初始化類總是讓人很厭煩。思考下,例如,一個簡單的自定義集合型別(如,Queue<T>),在其內部維護一個私有 System.Collections.Generic.List<T> 屬性列表。當例項化集合時,就必須初始化這個包含列表的佇列,但是,對於一個屬性,這樣做的合理方案是支援的欄位需要有一個初始化器或其他建構函式,但是,這種組合的方式程式碼量幾乎會翻番。

用C#6.0中,有一個捷徑:自動屬性初始化。現在,就可以指定直接初始化,程式碼如下:

    internal class Queue<T>
    {
        private List<T> InternalCollection { get; } = new List<T> ;
        // Queue Implementation
        // ...
    }

注意:上面的情況,屬性是隻讀的沒有定義 setter。屬性是在宣告時被賦值的。帶有 setter 的讀/寫屬性也是支援的。

更多內容請參考http://msdn.microsoft.com/en-us/magazine/dn683793.aspx