龙空技术网

4.4 C#的泛型和委托

万亿神帝的梦 452

前言:

今天姐妹们对“button onclick属性”都比较重视,你们都需要剖析一些“button onclick属性”的相关内容。那么小编同时在网络上汇集了一些有关“button onclick属性””的相关内容,希望各位老铁们能喜欢,姐妹们快快来学习一下吧!

C#的泛型和委托什么是泛型

泛型是C# 2.0中引入的一种编程技术,它可以让你定义一个通用的类型参数,然后在使用时指定具体的类型。这样,你就可以编写一套适用于多种类型的代码,而不需要重复编写相同的逻辑。泛型可以提高代码的可重用性和类型安全性,同时也可以避免不必要的装箱和拆箱操作,提高性能。

泛型可以用于类、接口、方法、委托、事件等地方。例如,你可以定义一个泛型类Stack<T>,表示一个存储任意类型元素的栈结构:

class Stack<T>{    private T[] items;    private int top;    public Stack(int size)    {        items = new T[size];        top = -1;    }    public void Push(T item)    {        if (top == items.Length - 1)        {            throw new InvalidOperationException("Stack is full.");        }        items[++top] = item;    }    public T Pop()    {        if (top == -1)        {            throw new InvalidOperationException("Stack is empty.");        }        return items[top--];    }    public T Peek()    {        if (top == -1)        {            throw new InvalidOperationException("Stack is empty.");        }        return items[top];    }    public bool IsEmpty()    {        return top == -1;    }}

然后,在使用时,你可以指定具体的类型参数,例如Stack<int>或Stack<string>:

Stack<int> stack1 = new Stack<int>(10);stack1.Push(1);stack1.Push(2);stack1.Push(3);Console.WriteLine(stack1.Pop()); // 3Console.WriteLine(stack1.Peek()); // 2Console.WriteLine(stack1.IsEmpty()); // FalseStack<string> stack2 = new Stack<string>(5);stack2.Push("Hello");stack2.Push("World");Console.WriteLine(stack2.Pop()); // WorldConsole.WriteLine(stack2.Peek()); // HelloConsole.WriteLine(stack2.IsEmpty()); // False

这样,你就可以使用同一个Stack<T>类来存储不同类型的数据,而不需要为每种类型都定义一个单独的类。

什么是委托

委托是C#中一种特殊的类型,它表示一个方法的引用。你可以把委托看作是一个指向方法的变量,它可以存储一个或多个具有相同签名(参数类型和返回值类型)的方法。通过委托,你可以将方法作为参数传递给其他方法,或者将方法赋值给事件,实现回调和事件驱动编程。

委托的声明使用delegate关键字,同时要指定方法的签名。例如,你可以定义一个委托Del,表示一个没有参数和返回值的方法:

public delegate void Del();

然后,在使用时,你可以给委托赋值一个或多个符合签名的方法:

public static void Method1(){    Console.WriteLine("Method 1");}public static void Method2(){    Console.WriteLine("Method 2");}Del del = Method1; // 单播委托del += Method2; // 多播委托

然后,你可以调用委托,执行它所包含的所有方法:

del(); // 输出 Method 1 和 Method 2

你也可以使用Invoke方法来调用委托:

del.Invoke(); // 输出 Method 1 和 Method 2

委托的一个常见用途是作为事件的处理器。事件是一种特殊的委托,它表示一个发生在对象上的动作或通知。你可以给事件添加一个或多个方法,当事件被触发时,这些方法就会被执行。例如,你可以定义一个Button类,它有一个Click事件,表示用户点击了按钮:

class Button{    public event Del Click; // 声明一个事件    public void OnClick()    {        if (Click != null) // 判断事件是否为空        {            Click(); // 触发事件        }    }}

然后,在使用时,你可以给Click事件添加方法,例如打印一些信息:

Button button = new Button();button.Click += () => Console.WriteLine("You clicked the button."); // 使用Lambda表达式作为方法button.OnClick(); // 输出 You clicked the button.
什么是泛型委托

泛型委托是一种特殊的委托,它可以接受泛型类型参数,从而适用于多种类型的方法。.NET框架为我们提供了三种常用的泛型委托:Func<T>、Action<T>和Predicate<T>。

Func<T>代表一个有返回值的泛型委托,它有多个重载,最后一个类型参数表示返回值类型,其余的表示参数类型。例如,Func<int,int,int>表示一个接受两个整数参数并返回一个整数值的方法。Action<T>代表一个无返回值的泛型委托,它也有多个重载,类型参数表示参数类型。例如,Action<string>表示一个接受一个字符串参数并无返回值的方法。Predicate<T>代表一个返回布尔值的泛型委托,它只有一个类型参数,表示参数类型。例如,Predicate<int>表示一个接受一个整数参数并返回一个布尔值的方法。

使用泛型委托可以简化代码,避免为每种类型都定义单独的委托。例如,你可以使用Func<int,int,int>来替代上面定义的MyCalculator委托:

static int Calculate(int num1, int num2, Func<int, int, int> calDel){    return calDel(num1,num2);}

你也可以使用Lambda表达式来简化委托的赋值和调用:

int calNum = Calculate(1, 2, (x,y) => x + y); // 使用Lambda表达式作为方法Console.WriteLine(calNum); // 3
总结

泛型和委托是C#中两个非常重要和强大的特性,它们可以让你编写更灵活和高效的代码。通过使用泛型,你可以编写一套适用于多种类型的代码,而不需要重复编写相同的逻辑。通过使用委托,你可以将方法作为参数传递给其他方法,或者将方法赋值给事件,实现回调和事件驱动编程。通过使用泛型委托,你可以简化代码,避免为每种类型都定义单独的委托。

希望这篇文章对你有所帮助。如果你对C#的泛型和委托有什么问题或建议,欢迎在评论区留言。如果你觉得这篇文章对你有用,也请给我一个赞或分享。谢谢你的阅读,祝你学习愉快!

标签: #button onclick属性 #net泛型的作用