C#代表 - 你多久使用它们,何时使用它们?

时间:2008-11-20 18:39:23

标签: c# delegates

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

您经常使用它们,在什么情况下它们最有用?

9 个答案:

答案 0 :(得分:6)

我使用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");

答案 1 :(得分:4)

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

答案 2 :(得分: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。

答案 3 :(得分: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);

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

答案 4 :(得分:1)

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

List.ForEach(委托...)

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我过去经常使用它们,因为Daok说的是事件,直到我了解到你可以使用内置的处理程序来处理大多数常见事件(至少我做的事情很常见)。现在我通常将它们用作API交互的回调处理程序。

答案 8 :(得分:0)

我写过这篇文章,也许这会有所帮助: http://www.codeproject.com/KB/cs/Cs_delegates101_practical.aspx