2017年10月31日 星期二

C#語法糖

無無聊聊翻開了本c# in a nutshell看了一下 發現了一個和c++幾乎一模一樣的語法糖
using System;
public class Wine
{
  public decimal Price;
  public int Year;
  public Wine (decimal price) { Price = price; }
  public Wine (decimal price, int year) : this (price) { Year = year; }
}
和以下這段code是等價的
using System;
public class Wine
{
  public decimal Price;
  public int Year;
  public Wine (decimal price) { Price = price; }
  public Wine (decimal price, int year) { Wine(price); Year = year; }
}
一樣都會改Price的值 上網找了一下 發現原來還有很多方便的語法糖 以下節錄幾個常用的
經過兩次變異的委託寫法
真的易用多了一開始推出的時候真的完全看不懂
class MyClass
{
    public delegate void DoSomething(int a);
 
    //定義方法委託
    private void DoIt(int a) {
        Console.WriteLine(a);
    }
 
    private void HowtoDo(DoSomething doMethod,int a) {
        doMethod(a);
    }
 
    public static void Main(string[] args) {
        MyClass mc = new MyClass();
        //調用定義的方法委託
        mc.HowtoDo(new DoSomething(mc.DoIt), 10);
        int x = 10;
        //使用匿名委託
        mc.HowtoDo(delegate(int a){
            Console.WriteLine(a + x);
        },10);
 
        //使用lamda表達式
        mc.HowtoDo(a=>Console.WriteLine(a+x),10);
 
        Console.ReadLine();
    }
}
集合類的聲明
以前:
List list = new List();
list.Add("a一");
list.Add("b二");
list.Add("c三");
現在:
List list = new List {
            "def","OK"
};
集合類各個項的操作
以前:
foreach (string item in list)
{
     Console.WriteLine(item);
}
現在(朝FP之路邁進?XD):
list.ForEach(a => Console.WriteLine(a));
傳說中的擴展方法
擴展一個String的方法:
public static class StringExt {
    static private Regex regexNumber = new Regex("\\d+");
    static public bool IsNumber(this string input)
    {
        if (string.IsNullOrEmpty(input))
        {
            return false;
        }
        return regexNumber.IsMatch(input);
    }
}
使用:
var abc = "123";
var isNumber = abs.IsNumber();
有興趣知更多的可以到原站看看 再post多次連結: C#語法糖(Csharp Syntactic sugar)大匯總
其實語法糖很常見 只是不知道為什麼C#好像特別多(還是說玩C#的都很懶?)

沒有留言:

張貼留言