我在C#中比较新,我想知道何时适当地使用Delegates.它们被广泛用于事件声明中,但何时应该在我自己的代码中使用它们,为什么它们有用? 为什么不用别的东西?
我也想知道何时必须使用代表,我别无选择.
感谢您的帮助!
编辑:我想我已经在这里找到了代表 的必要用法
除了语法糖之外,我没有看到使用事件而不是代理的优点.也许我是误会,但似乎事件只是代表的占位符.
你能告诉我差异以及何时使用哪个?有哪些优点和缺点?我们的代码严重依赖于事件,我想深入了解它.
你何时会在事件中使用代表,反之亦然?请在生产代码中说明您对这两者的真实体验.
我在使用Action委托的许多在线示例中看到了这一行:
public event Action MyEvent;
Run Code Online (Sandbox Code Playgroud)
但是当我在自己的代码中尝试它时,我得到了这个错误
使用泛型类型'System.Action'需要'1'类型参数
文档肯定描述了一种没有任何类型参数的Action形式.我错过了什么?
我想在发生陷阱时向任何订户通知警报消息.
我通过委托方法(myDelegate del)制作的代码很好.
我的问题是......
我想知道是否值得使用Eventhandler更好的代理?在我的情况下,不确定委托和事件之间的区别是什么?
通知(trapinfo t),这就是我在这里所做的,以获取陷阱信息.但似乎不是一个好主意.阅读一些介绍传递委托对象的在线教程课程,是否适合我的情况?我该怎么办?有什么建议?
非常感谢 :)
我的代码:
public class trapinfo
{
public string info;
public string ip;
public string cause;
}
public class trap
{
public delegate void myDelegate(trapinfo t);
public myDelegate del;
trapinfo info = new trapinfo();
public void run()
{
//While(true)
// If a trap occurred, notify the subscriber
for (; ; )
{
Thread.Sleep(500);
foreach (myDelegate d in del.GetInvocationList())
{
info.cause = "Shut Down";
info.ip = "192.168.0.1";
info.info = "Test";
d.Invoke(info);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我理解事件在C#中的运作方式(在这个领域是一个公平的新手).我想要了解的是我们使用事件的原因.
您是否知道使用事件的编码良好/架构好的应用程序?
我对Vb.Net事件和处理程序很满意.任何人都可以帮助我如何在c#中创建事件处理程序,并引发事件.
我正在Windows 8 Visual Studio 11中开发一个应用程序,我想为DispatcherTimer实例定义一个事件处理程序,如下所示:
public sealed partial class BlankPage : Page
{
int timecounter = 10;
DispatcherTimer timer = new DispatcherTimer();
public BlankPage()
{
this.InitializeComponent();
timer.Tick += new EventHandler(HandleTick);
}
private void HandleTick(object s,EventArgs e)
{
timecounter--;
if (timecounter ==0)
{
//disable all buttons here
}
}
.....
}
Run Code Online (Sandbox Code Playgroud)
但是我得到以下错误:
Cannot implicitly convert type 'System.EventHandler' to 'System.EventHandler<object>'
Run Code Online (Sandbox Code Playgroud)
我是widows 8应用程序的新手开发者.
你能帮帮我吗?
我已经阅读了一些关于此的线索,但我仍然不知道如何在我的情况下解决它.我来自Java,大多是C#的新手
我想在动画结束时附加监听器:
myStoryBoard.Completed += new EventHandler(onMyStoryBoardCompleted);
Run Code Online (Sandbox Code Playgroud)
和:
private void onMyStoryBoardCompleted(object sender, EventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
我在标题中得到错误.我试过了:
myStoryBoard.Completed += new EventHandler<object>(onMyStoryBoardCompleted);
Run Code Online (Sandbox Code Playgroud)
但后来我得到:
no overload for 'onMyStoryBoardCompleted' matches delegate 'System.EventHandler<object>'
Run Code Online (Sandbox Code Playgroud)
所以似乎签名与EventHandler不兼容,<object>我找不到如何使它兼容,我也不知道这种方法是否正确.
我读
从System.EventHandler到System.EventHandler <TEventArgs>的C#动态模板隐式转换错误
在Windows 8应用程序中为DispatcherTimer的Tick事件定义事件处理程序
但仍然没有找到这种情况的解决方案.
提前致谢.
我在C#中注意到我可以覆盖Form()父类中的方法,如下所示:
protected override void OnPaint(PaintEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
我不明白如何PaintEventArgs生成以及如何/何时将其传递给此函数.我必须假设OnPaint()每次表格需要重新绘制时都会调用.
此外,当我创建按钮按事件时,它们看起来像这样:
private void button1_Click(object sender, EventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
再次,我不明白激活按钮点击时这些参数是如何/为什么传递的.
我目前正在使用OpenTK Framework和OpenGL在C#中编写Jump n'Run游戏.
Open TK提供类似GameWindow.Run();或的预设功能GameWindow.onUpdateFrame(); onRenderFrame();
据我所知,绘制OpenGL元素或基元的所有动作都属于onRenderFrame,而玩家移动等游戏事件应该在onUpdateFrame中执行,因此可以在渲染新帧之前预先计算这些动作.
我对吗?在onRenderFrame方法中执行所有操作会有所不同吗?OpenTK建议不要覆盖这些方法并订阅他们的事件(onRenderFrameEvent).
什么是订阅,我将如何订阅事件而不是覆盖方法?
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
this.gameObjects.moveObjects();
this.player.Move();
if (this.player.jumpstate == true) this.player.Jump();
}
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref modelview);
GL.LoadIdentity();
GL.Translate(0.0f, 0.0f, -3.5f);
this.gameObjects.drawObjects();
this.player.Draw();
SwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)