ale*_*rul 16 c# generics delegates
我使用以下方法:
public void M1(Int32 a)
{
// acquire MyMutex
DoSomething(a);
// release MyMutex
}
Run Code Online (Sandbox Code Playgroud)
和
public void M2(String s, String t)
{
// acquire MyMutex
DoSomethingElse(s, t);
// release MyMutex
}
Run Code Online (Sandbox Code Playgroud)
从我到目前为止所发现的情况来看,似乎不可能对具有不同签名的两种方法使用单个委托.
有没有其他选择写这样的东西:
public void UsingMutex(...)
{
// acquire MyMutex
...
// release MyMutex
}
UsingMutex(M1);
UsingMutex(M2);
Run Code Online (Sandbox Code Playgroud)
我现在能想到的只是使用两个委托和一个布尔标志来知道要调用哪个委托,但这不是一个长期的解决方案.
可以将泛型与代表结合起来吗?如果是这样,您是否有任何类型的文档链接?
环境:C#2.0
Mar*_*ell 19
绝对可以将代表与泛型混合使用.在2.0 Predicate<T>等中就是很好的例子,但你必须拥有相同数量的args.在这种情况下,也许一个选项是使用捕获来包含委托中的args?
即
public delegate void Action();
static void Main()
{
DoStuff(delegate {Foo(5);});
DoStuff(delegate {Bar("abc","def");});
}
static void DoStuff(Action action)
{
action();
}
static void Foo(int i)
{
Console.WriteLine(i);
}
static void Bar(string s, string t)
{
Console.WriteLine(s+t);
}
Run Code Online (Sandbox Code Playgroud)
请注意,这Action是在.NET 3.5中为您定义的,但您可以为2.0目的重新声明它;-p
请注意,匿名方法(delegate {...})也可以参数化:
static void Main()
{
DoStuff(delegate (string s) {Foo(5);});
DoStuff(delegate (string s) {Bar(s,"def");});
}
static void DoStuff(Action<string> action)
{
action("abc");
}
static void Foo(int i)
{
Console.WriteLine(i);
}
static void Bar(string s, string t)
{
Console.WriteLine(s+t);
}
Run Code Online (Sandbox Code Playgroud)
最后,C#3.0使用"lambdas"使这一切变得更加容易和漂亮,但这是另一个主题;-p