gpt4 book ai didi

c# - 请告诉我一个为委托(delegate)(或)函数指针显示 `need` 的情况

转载 作者:太空狗 更新时间:2023-10-29 23:21:23 27 4
gpt4 key购买 nike

我要为正在学习级别的程序员的学生上一堂关于“委托(delegate)和回调”的类(class)。他们具有基本的 c/c++ 和 c# 背景。而不是直接展示如何使用它们。我想展示“为什么是函数指针?”第一的。我想从一个例子开始,问他们“你将如何做”?让他们意识到需要某些东西,然后向他们介绍 FunctionPointers、Delegates 和 CallBacks。

那么,任何人都可以给我一个很好的例子来说明在 C# 中需要委托(delegate)(或)在 C/C++ 中需要函数指针。我不想在 GUI 示例中使用事件处理示例,也不想使用 add2numbers 等示例演示“如何使用委托(delegate)”。

我正在寻找一些实际的例子,他们可以从中感受到 FunctionPointers、Delegates 和 CallBacks 的需要。

如果有什么好的文章,请发表。

最佳答案

您可以向他们展示在您的软件的多个位置过滤项目列表的示例。

例如,您可能有

public List<Person> GetMale(List<Person> people)
{
List<Person> results = new List<Person>();
foreach (Person p in people)
{
if (p.IsMale)
results.Add(p);
}
return results;
}

public List<Person> GetFemale(List<Person> people)
{
List<Person> results = new List<Person>();
foreach (Person p in people)
{
if (!p.IsMale)
results.Add(p);
}
return results;
}

为了避免在每个方法中重复 foreach 迭代,您需要提取实际条件(即本例中的 predicate),并在其他地方实现它.

因此,您将用以下方法替换这两个方法:

public List<Person> Filter(List<Person> people, Func<bool, Person> match)
{
List<Person> results = new List<Person>();
foreach (Person p in people)
{
if (match(p))
results.Add(p);
}
return results;
}

然后在您的代码中这样调用它:

List<Person> malePersons = Filter(people, p => p.IsMale);
List<Person> femalePersons = Filter(people, p => !p.IsMale);

请注意,实际条件现在已提取到迭代 block 之外,您可以重用相同的方法来创建您喜欢的任何自定义过滤逻辑。通过提取此逻辑,您将问题委托(delegate)给其他人,从而使您的代码松耦合。

使用 C# 2.0 匿名方法语法,调用此方法如下所示:

List<Person> malePersons = Filter(people, 
delegate (Person p) { return p.IsMale; });
List<Person> femalePersons = Filter(people,
delegate (Person p) { return !p.IsMale; });

或使用实际方法:

List<Person> malePersons = Filter(people, MaleMatch);
List<Person> femalePersons = Filter(people, FemaleMatch);

其中谓词定义为:

private bool MaleMatch(Person p)
{
return p.IsMale;
}

private bool FemaleMatch(Person p)
{
return !p.IsMale;
}

重要的是要注意,我们传递的不是这些方法的结果,而是实际的方法“指针”,因此在 Filter 中调用方法时将返回实际结果 方法。

另请注意 LINQ in .Net 3.5已经包含一个 Where 扩展方法,它做同样的事情就像这个例子,还有许多其他使用委托(delegate)来处理条件、投影和其他东西的方法,所以你基本上只需要传递一个具有适当签名的委托(delegate).

关于c# - 请告诉我一个为委托(delegate)(或)函数指针显示 `need` 的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1802342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com