3

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

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

4

8 回答 8

6

我大部分时间使用 C# Delegate 和 Event。

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");
于 2008-11-20T18:41:12.083 回答
4

我将它们用于事件处理程序、回调和谓词等等。如果您使用 C++ 编程,您可以将它们视为函数指针,我认为它们的一些用途会立即显现出来。

于 2008-11-20T18:41:05.190 回答
3

当您必须在样板代码中间更改一件事时,我特别喜欢代表:

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);
}

它们也以这种方式与 LINQ 一起大量使用。

于 2008-11-20T18:43:31.643 回答
3

Funcs 和 Actions 是代表的新“类型”,我在 Linq 和其他奇怪的情况下经常使用它们。对于 Linq,它们很好,因为我个人宁愿使用描述性名称而不是 lambda 表达式:

someList.Select(item => item.Name);

我可以在哪里使用 Func:

Func<Item, String> itemName = item => item.Name;
...
someList.Select(itemName);

可能会多出一行,但有时我发现自己在课堂上重复了几次特定的 lambda 表达式,所以我个人认为 Funcs 可以很好地解决这个问题。

另一种情况是,由于缺乏更好的术语,方法工厂。基本上,它是一个字典,其中包含一个 Actions 列表作为值,并说一个 Enum 作为键:

Dictionary<UserType, Action<User>> showControls;
showControls = new Dictionary<UserType, Action<User>>();

showControls.Add(SomeEnum.Admin, setControlsForAdmin);
showControls.Add(SomeEnum.Normal, setControlsForNormalUser);
showControls.Add(SomeEnum.Unregistered, setControlsForUnregisteredUser);

然后我将方法本身写在页面的其他地方。用途是:

showControls[user.UserType]();

或者,也许您想将方法本身传递给另一个:

Action<User> neededMethod;

neededMethod = showControls[user.UserType];

SomeMethod(neededMethod);

我确信代表有更好的用途,但这些很有用。

于 2008-11-20T18:53:35.710 回答
1

事件,谓词搜索,有时是内联功能......它们在大量场景中都很有用......

List.ForEach(代表...)

于 2008-11-20T18:41:32.507 回答
1

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

myList.Sort(a=> a.LastName);
于 2008-11-20T18:41:40.197 回答
0

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

于 2008-11-20T18:40:57.453 回答
0

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

于 2008-11-20T19:02:37.643 回答