在 funcs 中封裝轉換

public class MyObject{
    public DateTime? TestDate { get; set; }

    public Func<MyObject, bool> DateIsValid = myObject => myObject.TestDate.HasValue && myObject.TestDate > DateTime.Now;

    public void DoSomething(){
        //We can do this:
        if(this.TestDate.HasValue && this.TestDate > DateTime.Now){
            CallAnotherMethod();
        }

        //or this:
        if(DateIsValid(this)){
            CallAnotherMethod();
        }
    }
}

本著清晰編碼的精神,將上面的檢查和轉換封裝為 Func 可以使你的程式碼更易於閱讀和理解。雖然上面的例子非常簡單,但是如果有多個 DateTime 屬性,每個屬性都有自己不同的驗證規則,我們想檢查不同的組合?每個都具有已建立的返回邏輯的簡單單行 Func 既可讀也可降低程式碼的明顯複雜性。考慮下面的 Func 呼叫,並想象有多少程式碼會使方法變得混亂:

public void CheckForIntegrity(){
    if(ShipDateIsValid(this) && TestResultsHaveBeenIssued(this) && !TestResultsFail(this)){
        SendPassingTestNotification();
    }
}