C#-扩展方法,运算符重载,匿名方法,内置委托.LINQ语法

发布时间 2023-05-19 21:42:46作者: [春风十里]

1.扩展方法

为引用的类型追加方法,可提高代码编写效率,增加代码可读性;

例如有一个字符串,要对其进行2个操作:转换为整数;按1分割为数组;

string str = "0121314";//给出字符串
int iValue = Convert.ToInt32(str);//转换为整数
string[] arrStr = str.Split('1');//按1分隔为数组

我觉得上述写法不整洁,使用扩展方法对string类型追加几个方法,使其能实现上述2个功能:

public static class StringExpand//类型命名要规范,必须是静态类
{
    public static int ToInt(this string str)//必须是静态函数,首个参数必须写为this string xxx;
    {
        return Convert.ToInt32(str);
    }
    public static string[] ToArray(this string str, char c)//可指定任意数量参数
    {
        return str.Split(c);
    }
}

现在我可以如下实现功能:

string str = "0121314";//给出字符串
int iValue = str.ToInt();//转换为整数
string[] arrStr = str.ToArray('1');//按1分隔为数组

以上为扩展方法编写与使用,例子比较简单,实际应用中可将频繁/繁琐的操作或逻辑判断进行封装,使代码编写更友好。  

2.运算符重载

比如+-*/!等运算符常用于数值的计算,但事件的注册与解绑不是计算也可用+=/-=这种写法,这样看起来代码简洁可读性高

举例:有一个学习小组,有若干学生,现在要实现组内学生的加入或离开,常用写法如下:

public class StudyGroup
{
    List<Student> stus = new List<Student>();
    public void Add(Student stu)
    {
        stus.Add(stu);
    }
    public void Remove(Student stu)
    {
        stus.Remove(stu);
    }
}
*******************************************
StudyGroup grp = new StudyGroup();
Student stu = new Student();
grp.Add(stu);//加入
grp.Remove(stu);//离开

对运算符进行重载后,可使用如下写法:

public class StudyGroup
{
    List<Student> stus = new List<Student>();
    public static StudyGroup operator +(StudyGroup grp, Student stu)//
    {
        grp.stus.Add(stu);
        return grp;
    }
    public static StudyGroup operator -(StudyGroup grp, Student stu)
    {
        grp.stus.Remove(stu);
        return grp;
    }
}
*********************************************
StudyGroup grp = new StudyGroup();
Student stu = new Student();
grp += stu;//加入
grp -= stu;//离开

3.匿名方法

常用于事件注册,比如我要给一个按钮事件注册一个方法,我又不想写一个函数,可以如下写法:

this.button2.Click += button2_Click;//绑定一个函数
this.button2.Click += (object sender, EventArgs e) =>//绑定一个匿名函数
{
    //事件处理
};

4.内置委托

.net自带的委托Action/Func/Predicate,可满足大部分需求,不用自己再去写了,给出方法如下: 

public void Test() { }
public void Test1(int i) { }
public void Test2(int i,string s) { }
public string Test3() { return ""; }
public string Test4(int i) { return ""; }
public bool Test5(int i) { return false; }

使用内置委托:

Action action = Test;
Action<int> action1 = Test1;
Action<int, string> action2 = Test2;//Action支持任意数量类型参数,但不具有返回值
Func<string> action3 = Test3;
Func<int, string> action4 = Test4;
Func<int, bool> actino5 = Test5;//Func支持任意类型数量参数,有一个返回值。最后一个为返回值,前面的为参数
Predicate<int> action6 = Test5;//Predicate支持一个参数,有一个布尔类型的返回值

5.LINQ语法 

List<string> list = new List<string>();
var temp = from l in list where l.Length == 2 select l.Substring(1);//从list中找出长度为2的字符串并截取他们,然后返回一个可枚举类型IEnumerable<T>。

其中Where为筛选条件,可设置多重筛选;Select为要返回的元素类型,可按实际需求编写。