1. 程式人生 > >四、C#4.5語法新特徵-04(擴充套件方法)

四、C#4.5語法新特徵-04(擴充套件方法)

一、擴充套件方法

定義
1、擴充套件方法能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。
2、擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。
3、擴充套件方法被定義為靜態方法,但它們是通過例項方法語法進行呼叫的。 它們的第一個引數指定該方法作用於哪個型別,並且該引數以 this 修飾符為字首。
4、擴充套件方法的三個要素是:靜態類、靜態方法以及this關鍵字。

系統集合擴充套件方法:

1、Person類(實體類)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UI2
{
    public class Person
    {
        public Guid Pid { get; set; }
        public string Pname { get; set; }
        public int Page { get; set; }
        public char Psex { get; set; }

        public Person()
        {

        }
        public Person(Guid pid, string pname, int page, char psex)
        {
            Pid = pid;
            Pname = pname;
            Page = page;
            Psex = psex;
        }
    }
}

2、Method類(自定義擴充套件方法的類)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace UI2
{
    public static class Method
    {
        /// <summary>
        /// 1.判斷是否為空或者為NULL
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static bool IsNullOrEmpty(this string str)
        {
            return string.IsNullOrEmpty(str);
        }
        /// <summary>
        /// 2.正則表示式的擴充套件方法
        /// </summary>
        /// <param name="str"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static bool IsMatch(this string str,string pattern)
        {
            if (string.IsNullOrEmpty(str))
            {
                return false;
            }
            return Regex.IsMatch(str,pattern);
        }
        /// <summary>
        /// 3.判斷是否為Int
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static bool IsInt(this string str)
        {
            int i;
            return int.TryParse(str,out i);
        }
        /// <summary>
        /// 字串轉Int
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static int ToInt(this string str)
        {
            return int.Parse(str);
        }
    }
}

Program類 (Main方法)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UI2
{
    class Program
    {
        public delegate void DelegateTest(string name);

        static void Main(string[] args)
        {
            **1、集合的擴充套件方法-Select**   
            //例子1:
            List<int> ints = new List<int>()
            {
                1,2,3,4,5,6,7,8
            };
            var ins = ints.Select(delegate (int i)
            {
                return i > 5;
            });
            foreach (var i in ins)
            {
                Console.WriteLine(i);
            }
            //例子2:物件
            List<Person> persons = new List<Person>()
            {
                new Person(Guid.NewGuid(),"zs",18,'男'),
                new Person(Guid.NewGuid(),"ls",19,'女'),
                new Person(Guid.NewGuid(),"ww",20,'男')
            };
            var ps = persons.Select(delegate (Person p)
            {
                return p.Page > 19;
            });
            foreach (var p in ps)
            {
                Console.WriteLine(p);
            }


            **2、集合的擴充套件方法-Where**
            //例子1:
            List<int> ints = new List<int>()
            {
                1,2,3,4,5,6,7,8
            };
            IEnumerable<int> ins = ints.Where(delegate (int i)
            {
                return i > 3;
            });
            foreach (var i in ins)
            {
                Console.WriteLine(i);
            }
            //例子2:
            List<Person> persons = new List<Person>()
            //{
            //    new Person(Guid.NewGuid(),"zs",18,'男'),
            //    new Person(Guid.NewGuid(),"ls",19,'女'),
            //    new Person(Guid.NewGuid(),"ww",20,'男')
            //};
            //var lpp = persons.Where(delegate (Person p)
            //{
            //    return p.Page > 18;
            //});
            //foreach (var p in lpp)
            //{
            //    Console.WriteLine(p.Pname);
            //}


            **3、集合的擴充套件方法-Count**
            //例子1:
            List<int> ints = new List<int>() {
                1,2,3,4,5,6,7,8
            };
            int j = ints.Count(delegate (int i)
            {
                return i > 5;
            });
            Console.WriteLine(j);

            **4、集合的擴充套件方法-ForEach**
            List<int> ints = new List<int>() {
                1,2,3,4,5,6,7,8
            };
            ints.ForEach(delegate (int i)
            {
                if (i > 5)
                {
                    Console.WriteLine(i);
                }
                else
                {
                    Console.WriteLine("數字不大於5!!!");
                }
            });


            //自定義 擴充套件方法
            //Console.WriteLine(Method.IsNullOrEmpty(null));

            //判斷當前的字元是否是一個完整的數字
            //string str = "123";
            //string pattern = @"^[1-9]\d+$";

            //郵箱
            //string str = "
[email protected]
"; //string pattern = @"^\w+\@\w+(.com|cn|.org|.xyz|.net)$"; //手機號碼 //string str = "18570665187"; //string pattern = @"^1[3-9]\d{9}$"; //區號-電話號碼-分機號 //string str = "0731-88888888-1234"; //string pattern = @"^0[3-8]\d{1,2}-[1-9]{7,8}-\d{3,4}$"; //Console.WriteLine(Method.IsMatch(str,pattern)); //判斷是否是Int型別 //Console.WriteLine(Method.IsInt("1")); //string轉int Console.WriteLine(Method.ToInt("1")); Console.ReadKey(); } } }

二、正則表示式

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

三、總結

1.定義擴充套件方法:
(1).必須在靜態類中
(2).必須有一個引數
(3).引數必須已this打頭
(4).第一個引數不能夠有修飾符(out/ref)
2.把擴充套件方法定義到其它程式集中時,一定要注意呼叫擴充套件方法的環境中需要包含擴充套件方法所在的名稱空間
3.建議只在不得已的情況下才實現擴充套件方法,並謹慎地實現