我有一个类如下:
class Foo
{
public Foo(int x) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我需要传递一个像这样的委托的方法:
delegate Foo FooGenerator(int x);
Run Code Online (Sandbox Code Playgroud)
是否可以直接将构造函数作为FooGenerator值传递,而无需键入:
delegate(int x) { return new Foo(x); }
Run Code Online (Sandbox Code Playgroud)
?
编辑:对于我个人使用,问题涉及.NET 2.0,但欢迎3.0 +的提示/响应.
我已经阅读了关于每个BeginInvoke()是否必须与EndInvoke()匹配的矛盾意见.是否有任何与调用EndInvoke()相关的泄漏或其他问题?
哪个更正确,为什么?
Control.BeginInvoke(new Action(DoSomething), null);
private void DoSomething()
{
MessageBox.Show("What a great post");
}
Run Code Online (Sandbox Code Playgroud)
要么
Control.BeginInvoke((MethodInvoker) delegate {
MessageBox.Show("What a great post");
});
Run Code Online (Sandbox Code Playgroud)
我觉得我在做同样的事情,所以什么时候适合使用MethodInvokervs Action,甚至写一个lambda表达式?
编辑:我知道写一个lambda vs之间并没有什么区别Action,但MethodInvoker似乎是出于特定目的.它有什么不同吗?
I never seem to understand why we need delegates? I know they are immutable reference types that hold reference of a method but why can't we just call the method directly, instead of calling it via a delegate?
Thanks
有人会解释我什么时候想要使用Groovy Traits vs. Mixins(@Mixin)与代表(@Delegate)?也许一些权衡和设计问题会有所帮助.
它们似乎都允许重复使用多个"类"行为.谢谢.:-)
这个SO线程也很有帮助:Groovy中@Delegate和@Mixin AST转换之间的区别
有谁知道检查是否已实施可选协议方法的最佳方法.
我试过这个:
if ([self.delegate respondsToSelector:@selector(optionalProtocolMethod:)] )
Run Code Online (Sandbox Code Playgroud)
代表是:
id<MyProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误,说respondsToSelector:该协议中找不到该功能!
我读过两本书,很多例子.他们仍然对我毫无意义.我可能会写一些使用委托的代码,但我不知道为什么.我是唯一有这个问题的人,还是我只是个白痴?如果有人能够向我解释何时,何地以及为什么我会真正使用代表,我会永远爱你.
可能重复:
您何时在C#中使用委托?
代表们的目的
我看到很多关于代表使用的问题.我仍然不清楚你在哪里和为什么使用代理而不是直接调用方法.
我多次听过这个短语:"然后可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法."
我不明白这句话是怎么回事.
我写了以下例子.假设您有3个具有相同参数的方法:
public int add(int x, int y)
{
int total;
return total = x + y;
}
public int multiply(int x, int y)
{
int total;
return total = x * y;
}
public int subtract(int x, int y)
{
int total;
return total = x - y;
}
Run Code Online (Sandbox Code Playgroud)
现在我宣布一个代表:
public delegate int Operations(int x, int y);
Run Code Online (Sandbox Code Playgroud)
现在我可以更进一步声明一个处理程序来使用这个委托(或你的委托直接)
致电代表:
MyClass f = new MyClass();
Operations p = new Operations(f.multiply);
p.Invoke(5, 5);
Run Code Online (Sandbox Code Playgroud)
或者使用处理程序调用
f.OperationsHandler = …Run Code Online (Sandbox Code Playgroud) a protocol和a有delegate什么区别?
和,
我们怎样才能声明variables中protocol class?
来自C#背景,我想创建一个定义函数签名的数据类型.在C#中,这是一个delegate声明如下:
delegate void Greeter (string message);
public class Foo
{
public void SayHi (Greeter g) {
g("Hi!");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在Typescript中实现类似的功能.我知道Typescript没有委托类型,但只有lambdas.我提出了这样的事情:
class Foo {
SayHi (greeter: (msg: String) => void) {
greeter('Hi!');
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但我想重复使用方法签名(msg:String) => void几次,并认为创建自定义类型会更清晰 - 就像C#中的委托一样.
有什么想法可以做到这一点?
delegates ×10
c# ×7
objective-c ×2
protocols ×2
.net ×1
constructor ×1
groovy ×1
invoke ×1
ios ×1
iphone ×1
lambda ×1
mixins ×1
traits ×1
types ×1
typescript ×1