天天看點

C# this的用法:為原始類型擴充方法

本文導讀:擴充方法被定義為靜态方法,但它們是通過執行個體方法文法進行調用的。 它們的第一個參數指定該方法作用于哪個類型,并且該參數以 this 修飾符為字首。 擴充方法當然不能破壞面向對象封裝的概念,是以隻能是通路所擴充類的public成員。

擴充方法使您能夠向現有類型“添加”方法,而無需建立新的派生類型、重新編譯或以其他方式修改原始類型。擴充方法是一種特殊的靜态方法,但可以像擴充類型上的執行個體方法一樣進行調用。

C#擴充方法第一個參數指定該方法作用于哪個類型,并且該參數以 this 修飾符為字首。

聲明擴充方法注:

 1. 靜态類    (擴充方法所在類是static)

 2. 靜态方法  (擴充方法是static)

 3. 第一個參數(參數this和擴充的類型必不可少)

//必須是靜态類才可以添加擴充方法
    static class MyExtendHelper
    {
        //聲明擴充方法注:
        // 1. 靜态類    (擴充方法所在類是static)
        // 2. 靜态方法  (擴充方法是static)
        // 3. 第一個參數(參數this和擴充的類型必不可少)
        //--------------------------
        //-----示例1. 系統類擴充
        //擴充方法必須是靜态的,Add有三個參數
        //this 必須有,string表示我要擴充的類型,stringName表示要擴充的類型參數名  
        // 擴充方法不帶參數      
        public static string Add(this string stringName)
        {
            return stringName + "_a";
        }
        //擴充方法帶1個參數
        public static string Add(this string stringName,string addStr)
        {
            return stringName + addStr;
        }

        //-----示例2. 自定義類擴充
        // 擴充方法不帶參數
        public static string ExtensionStuInfo(this Student stuName)
        {
            return stuName.StuInfo();
        }
        //擴充方法帶參數2個參數
        public static string ExtensionGetStuInfo(this Student student, string stuname, string stunum)
        {
            return student.getStuInfo(stuname, stunum) + "\\n讀取完畢";
        }
    }


    public class Student
    {
        public string StuInfo()
        {
            return "學生基本資訊";
        }
        public string getStuInfo(string stuName, string stuNum)
        {
            return string.Format("學生資訊:\\n" + "姓名:{0} \\n" + "學号:{1}", stuName, stuNum);
        }
    }

// 測試
public static void Main()
{
    string str = "quzijing";
    //注意調用擴充方法,必須用對象來調用 
    string Newstr = str.Add();
    string Newstr2 = str.Add("_abc");
    Console.WriteLine(Newstr);
    Console.ReadKey();



    Student newstudent = new Student();
    //要使用對象調用我們的擴充方法
    string stuinfo = newstudent.ExtensionStuInfo();
    Console.WriteLine(stuinfo);
    //要使用對象調用我們的擴充方法
    string stuinformation = newstudent.ExtensionGetStuInfo("quzijing", "20081766");
    Console.WriteLine(stuinformation);
    Console.ReadKey();
}
           

this其他用法:

一  this代表目前類的執行個體對象

public class Test
{
    private string scope = "全局變量";
    public string getResult()
    {
        string scope = "局部變量";
        // this代表Test的執行個體對象
        // 是以this.scope對應的是全局變量
        // scope對應的是getResult方法内的局部變量
        return this.scope + "-" + scope;
    }
}
           

二  用this串聯構造函數

public class Test
{
    public Test()
    {
        Console.WriteLine("無參構造函數");
    }
    // this()對應無參構造方法Test()
    // 先執行Test(),後執行Test(string text)
    public Test(string text) : this()
    {
        Console.WriteLine(text);
        Console.WriteLine("有參構造函數");
    }
}
           

三  為原始類型擴充方法

四  索引器(基于索引器封裝EPList,用于優化大資料下頻發的Linq查詢引發的程式性能問題,通過索引從list集合中查詢資料)

參照連結:https://www.cnblogs.com/opop/p/5553803.html

參照連結:https://www.cnblogs.com/yellowcool/p/7908607.html