.net 委托的使用方法以及使用委托的好處


使用之前先大概了解一下,什么是委托?

從字面意思來理解:我委托某一個人幫我做一件事情,比如,我由於某些原因不能像小紅表白,那么我請小明幫我去跟小紅表白,那么我請小明幫我表白的這種行為,就叫做委托

A 請求 B 幫我獲取或者傳遞的行為,就叫做委托

 

委托的聲明方法:

//無返回值無參數委托的定義方法
public delegate void NoReturnPara();

無參數,無返回值方法:

public void DoNothing()
{
    // 沒有參數,沒有返回值
}

 

給委托賦值的幾種方式

//實例化委托,並傳入方法
NoReturbNoPara noreturn = new NoReturbNoPara(this.DoNothing);
//LinqToObject
NoReturbNoPara noreturn = () => { };
//直接賦值
NoReturbNoPara noreturn = this.DoNothing;

//調用委托的方法

noreturn.Invoke()

上面展示的是委托的基本定義於使用方法,現在實際B/S項目中基本摒棄了這種寫法,轉而使用封裝好的泛型委托來使用

使用方法:

//無返回值,無參數委托,不需要單獨聲明
Action act = this.DoNothing;
//無返回值,有參數委托,參數類型為泛型
Action<string> act = p => { };
//返回類型為string,參數類型為string的委托
Func<string,string> func = p => p;

//返回類型為bool,參數類型為string的委托
Func<string,bool> func = p => p.Equals('');

 

下面寫幾個簡單的demo演示一下

    /// <summary>
    /// 擴展方法
    /// </summary>
    public static class DelegateExtend
    {
        /// <summary>
        /// 模仿Linq的Where操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="scoure">數據源</param>
        /// <param name="func">委托(自定義bool條件)</param>
        /// <returns></returns>
        public static IEnumerable<T> ExtWhere<T>(this IEnumerable<T> scoure, Func<T, bool> func)
        {
            //遍歷數據源的數據
            foreach (var item in scoure)
            {
                //請求委托完成條件的篩選返回bool
                bool bResult = func(item);
                //把通過篩選提交的數據源,返回出去
                if (bResult)
                {
                    yield return item;
                }
            }
        }
    }

下面來調用這個方法,看一下委托的具體使用方法

   /// <summary>
    /// 實體模型
    /// </summary>
    public class Student
    {
        /// <summary>
        /// ID
        /// </summary>
        public string Id { get; set; }
        /// <summary>
        /// 名稱
        /// </summary>
        public string Name { get; set; }
    }
        //查詢出所有數據
            IEnumerable<Student> student = sql.QueryList<Student>();
            //定義一個匿名方法,並賦值給委托
            Func<Student, bool> func = delegate(Student s)
            {
                //自定義代碼邏輯,返回bool類型
                return s.Id.Equals("1");
            };
            //傳入委托
            IEnumerable<Student> list = student.ExtWhere(func);

        //第二種方法,使用linq語法(自定義邏輯)
            IEnumerable<Student> list1 = student.ExtWhere(p => p.Id.Equals("1"));

上面就是一個簡單但很常見的委托使用場景

從側面理解一下這段代碼,

ExtWhere 是我要做的一件事情,但這件事情里面我需要一個bool類型的返回結果,那么我委托func去幫我獲取到這個bool類型的結果

我剛開始的時候,對委托的理解覺得很困難,總感覺暈暈的,但是自己沒事多練習練習之后,就會很好理解了

上面的demo很好的解釋了使用委托的好處

解耦:抽出自定義邏輯,保留相同的邏輯,使代碼分離

最大限度的簡化代碼:解耦的同時,又減少了代碼量(自定義邏輯,可以避免相同邏輯的代碼重復)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM