delegate代理相当于C语言中的函数指针,代理和方法需要满足返回值类型、参数类型一致。
实例声明了三个代理,分别指向无返回值、无参数方法,无返回值、有一个参数方法,有返回值、有一个参数方法。后面定义了三个相应的函数。然后在Main函数中定义并使用代理。
类中的静态方法,只能调用本类的静态成员或方法。因为main函数是静态的,所以ShowStockInfo1()等方法也需要是static的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateDemo
{
/// <summary>
/// delegate使用需经历声明、定义、使用3个步骤
/// delegate本身也是class类型,delegate申明在Program类之外
/// </summary>
public delegate void MyDelegate1(); // MyDelegate1指向无返回值、无参的方法
public delegate void MyDelagate2(string code); // MyDelegate2指向无返回值、有一个参数的方法
public delegate double MyDelegate3(Stock stock); // MyDelegate3指向有返回值、有一个参数的方法
class Program
{
//public delegate void MyDelegate1(); // 也可以申明在类内,嵌套类
static void Main(string[] args)
{
MyDelegate1 myDelegate1 = new MyDelegate1(ShowStockInfo1); // delegate定义
MyDelagate2 myDelagate2 = new MyDelagate2(ShowStockInfo2);
myDelegate1(); // delegate使用
myDelagate2("002301");
Stock myStock = new Stock(15.2, "零壹科技");
MyDelegate3 myDelegate3 = new MyDelegate3(GetStockPrice);
Console.WriteLine("Stock {0} and Price is {1}", myStock.Name, myDelegate3(myStock));
Console.ReadLine();
}
// 直接在static Main函数中调用代理,静态函数只能调用本类的静态函数
public static void ShowStockInfo1()
{
Console.WriteLine("Show Stock Info!\n");
}
public static void ShowStockInfo2(string code)
{
Console.WriteLine("Stock {0} Info Showed!", code);
}
public static double GetStockPrice(Stock _stock)
{
return _stock.Price;
}
}
public class Stock
{
private double price;
private string name;
public string Name
{
get
{
return name;
}
set
{
;
}
}
public double Price
{
get
{
return price;
}
}
public Stock(double _price, string _name)
{
price = _price;
name = _name;
}
}
}
参考文档:
https://docs.microsoft.com/en-us/dotnet/api/system.delegate?view=net-6.0