C# - 一些簡潔程式寫法

一行Code有許多種表達方式,可以用一般最大眾化的表示方式,也可以使用專家級的表示方式,兩種方式皆能達到同樣的效果,那何不使用最簡潔的方式呢?
以下我們將介紹幾種快速簡潔的Code表達方式。


判斷式給值

在一般遇到一個 if else 判斷式情況下,許多人就會很順手的馬上寫完 if else,

bool x = true;
int y = 0;
if (x)
{
    y = 100;
}
else
{
    y = -100;
}
但其實有更簡潔的寫法:
bool x = true;
int y = 0;
y = x ? 100 : -100;

表示方法如下
Variable = (Statment) ? TrueValue : FalseValue;

另外?:可以連續使用,類似以下:
Variable = (Statment1) ? Value1 : (Statement2) ? Value2 : Value3;

這邊要注意的是,?:表示式是右向關聯,例如 a ? b : c ? d : e 會先判斷c ? d : e,
整個表示式其實為 a ? b : (c ? d : e)

Null判斷給值

類似上一種寫法,C#在Null判斷給值上提供一個??運算子,表示如下:
string x = null;
string y = string.Empty;
y = x ?? "Hello";
當x為null時,y的值會等於Hello

二進制移位

Java和C#提供了一個二進制移位(<< >>)的運算子,根據移動的位數N將原有的數值以2的N次方進行運算,例如:
int x = 64;
int y = x >> 2;     // y = 64 / pow(2, 2)

建立型別別名(Alias)

當我們使用集合型別時,有時會遇到集合裡面又包了許多層的集合,
例如:Dictionary<String, List<Queue<String>>>,
這種情況在宣告或使用時要寫的漏漏長,
.Net提供了別名的功能,
只要在namespace裡加上using就能產生別名,
例如:using QueueList = List<Queue<String>>,
但缺點為該別名只能在這個File裡面用到,
就算在同個namespace不同File是無法識別的。


using System;
using System.Collections.Generic;

namespace ConsoleTest
{
    using QueueList = List<Queue<String>>;
    class Program
    {
        static void Main(String[] args)
        {
            var queue1 = new Queue<String>();
            var queue2 = new Queue<String>();
            var qList = new QueueList()
            {
                queue1, queue2
            };
            queue1.Enqueue("Item1");
            queue1.Enqueue("Item2");
            queue2.Enqueue("Item3");
            queue2.Enqueue("Item4");

            qList.ForEach(q =>
            {
                foreach (var s in q)
                {
                    Console.WriteLine(s);
                }
            });
            
            Console.ReadLine();
        }
    }
}


參考來源:

留言