C#代表-您多久使用一次,何时使用?

C#代表-您多久使用一次,何时使用?,c#,delegates,C#,Delegates,代理看起来像是一个强大的语言功能,但我还没有找到机会在愤怒中使用它们(我必须说,除了DAL) 你多久使用一次,在什么情况下你觉得它们最有用 我最常使用它们进行回调。我可以将一个方法包装在委托中并传递给它,而不是回调方法(使用接口)的对象。我将它们用于事件处理程序、回调和谓词。如果你已经用C++编程了,你可以把它们看作函数指针,我认为它们的一些用法立即变得明显。 < p>我用C代表大部分时间用事件。 public delegate void MyDelegate(object sender, Ev

代理看起来像是一个强大的语言功能,但我还没有找到机会在愤怒中使用它们(我必须说,除了DAL)


你多久使用一次,在什么情况下你觉得它们最有用

我最常使用它们进行回调。我可以将一个方法包装在委托中并传递给它,而不是回调方法(使用接口)的对象。

我将它们用于事件处理程序、回调和谓词。如果你已经用C++编程了,你可以把它们看作函数指针,我认为它们的一些用法立即变得明显。

< p>我用C代表大部分时间用事件。
public delegate void MyDelegate(object sender, EventArgs e, string otherParameterIWant);
//...Inside the class
public event MyDelegate myEvent;
//...Inside a method
if (myEvent != null)
    myEvent(this, new EventArgs(), "Test for SO");

事件、谓词搜索,有时是内联功能。。它们在很多场景中都很有用


ForEach(delegate…

好吧,在C#3中添加了lambda表达式,它们变得更易于使用,因为混乱的部分被隐藏了

myList.Sort(a=> a.LastName);

当你必须在样板代码中间改变一件事时,我尤其喜欢代表:

public delegate bool ItemFilterDelegate(MyItem item);

public IEnumerable<MyItem> FilterItems(ItemFilterDelegate filter)
{
    var result = new List<MyItem>();

    foreach(MyItem item in AllItems)
    {
        if(filter(item))
            result.Add(item);
    }

    return item;
}    

public IEnumerable<MyItem> FilterByName(string name)
{
    return FilterItems(item => item.Name == name);
}
public委托bool ItemFilterDelegate(MyItem);
公共IEnumerable筛选器项(ItemFilterDelegate筛选器)
{
var result=新列表();
foreach(所有项目中的MyItem)
{
if(过滤器(项目))
结果.添加(项目);
}
退货项目;
}    
公共IEnumerable FilterByName(字符串名称)
{
返回FilterItems(item=>item.Name==Name);
}

它们也以这种方式大量用于LINQ。

函数和动作是新的委托“类型”,我在LINQ和其他奇怪的情况下经常使用它们。对于Linq来说,它们很好,因为我个人更喜欢一个描述性的名称,而不是lambda表达式:

someList.Select(item => item.Name);
如果使用Func,我可以:

Func<Item, String> itemName = item => item.Name;
...
someList.Select(itemName);
或者,您可能希望将方法本身传递给另一个:

Action<User> neededMethod;

neededMethod = showControls[user.UserType];

SomeMethod(neededMethod);
需要采取的行动方法;
neededMethod=showControls[user.UserType];
SomeMethod(neededMethod);

我确信委托有更好的用途,但这些都很有用。

我一直都在使用它们,正如Daok对事件所说的那样,直到我了解到可以对大多数常见事件使用内置处理程序(至少对我所做的事是通用的)。现在我通常使用它们作为API交互的回调处理程序。

附带说明,如果需要,ItemFilterDelegate可以完全替换为Func,但我认为调用它可能更具可读性。
showControls[user.UserType]();
Action<User> neededMethod;

neededMethod = showControls[user.UserType];

SomeMethod(neededMethod);