在 C# 中,与 C/C++ 等效的函数指针 是委托。委托是一种表示对具有特定参数列表和返回类型的方法的引用的类型。实例化委托时,可以将其实例与具有兼容签名和返回类型的任何方法相关联。您可以通过委托实例调用该方法。
这是一个例子。首先,声明一个委托:
public delegate void Del(string message);
现在,Del 是一个委托类型,可用于调用任何返回 void 并接受 string 类型参数的方法。现在,让我们创建一些匹配Del的签名和返回类型的方法:
public static void DelegateMethod(string message)
{
Console.WriteLine(message);
}
现在,让我们创建一个Del 的实例并将其与DelegateMethod 关联,如下所示:
Del handler = DelegateMethod;
如果您想拨打DelegateMethod,您可以通过以下方式进行:
handler("Hello World");
请注意,由于Del 是一种类型,您可以执行以下操作:
public static void SomeMethod(Del callback, string callbackParams)
{
callback(callbackParams);
}
可以用作:
SomeMethod(handler, "Hello World");
话虽如此,还有其他与代表合作的方式。您可以使用Func 和Action 代表。 Func 是一个委托,它指向一个接受一个或多个参数并返回一个值的方法,也就是说,它不返回 void。 Action 是一个委托,它指向一个方法,该方法反过来接受一个或多个参数但不返回任何值(返回 void)。换句话说,当您的委托指向返回 void 的方法时,您应该使用 Action。
以下是使用Action 委托的示例:
static void Main(string[] args)
{
Action<string> action = new Action<string>(Display);
action("Hello!!!");
Console.Read(); //Prevents from closing the command line right away.
}
static void Display(string message)
{
Console.WriteLine(message);
}
因此,类似
void (* funcPtr)(int) = &someFuncWithAnIntArg;
(*funcPtr)(10);
在 C# 中等价于
Action<int> funcPtr = new Action<int>(someFuncWithAnIntArg);
funcPtr(10);
现在是Func 代表:
static void Main(string[] args)
{
Func<int, double> func = new Func<int, double>(CalculateHra);
Console.WriteLine(func(50000));
Console.Read();
}
static double CalculateHra(int basic)
{
return (double)(basic * .4);
}
Func 委托接受参数并返回值的语法类似于Func<TArgument, TOutput>,其中TArgument 是参数的类型,TOutput 是返回值的类型。 Func(浏览左侧树索引)和Action(也浏览左侧树索引)委托的类型还有很多。
最后但并非最不重要的是,我们有 Predicate 委托,它通常用于搜索集合或一组数据中的项目。让我们定义一些样板代码来解释:
class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
}
那么,让我们试试吧:
static void Main(string[] args)
{
List<Customer> customers = new List<Customer>();
customers.Add(new Customer { Id = 1, FirstName = "Stack" });
customers.Add(new Customer { Id = 2, FirstName = "Overflow" });
Predicate<Customer> pred = x => x.Id == 1;
Customer customer = customers.Find(pred);
Console.WriteLine(customer.FirstName);
Console.Read();
}
最后一个代码 sn-p 将打印“堆栈”。发生的事情是名为prep 的Predicate 委托被用作在列表customers 中搜索的搜索条件。基本上,这个委托在列表的每个元素x 上运行,当x.Id == 1 它返回true,否则返回false。谓词返回true 的x 元素作为Find 方法的结果返回。