代表看起来像是一个强大的语言功能,但我还没有找到机会在愤怒中使用它们(除了我必须说的DAL之外)。
您经常使用它们,在什么情况下它们最有用?
答案 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