在委托程序代码的问题

我做了这个代码在类库名为usedelegates

namespace useofdelegates { public class Class1 { //int i; public delegate void mydelegate(object sender,EventArgs e); public event mydelegate myevent; public void fire() { EventArgs ee = new EventArgs(); myevent(this,ee); } } }

然后在Windows窗体应用程序,我打算触发此事件上的一个按钮的点击。 在表单应用程序的代码:

namespace WindowsFormsApplication9 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } useofdelegates.Class1 ob; private void button1_Click(object sender, EventArgs e) { // ob = new useofdelegates.Class1(); ***ob.fire();***//give exception as object reference not set to an instance of an object.*/ } private void Form1_Load(object sender, EventArgs e) { useofdelegates.Class1 ob = new useofdelegates.Class1(); ob.myevent+=new useofdelegates.Class1.mydelegate(ob_myevent); // ob.fire(); } public void ob_myevent(object sender, EventArgs e) { MessageBox.Show("hello hapiness"); } } }

在编译此代码抛出一个异常:

你调用的对象是空的。

但是当我打电话ob.fire()form_load()它给了我没有任何异常所期望的结果。 这究竟是为什么?

--------------解决方案-------------

几件事情:

ob对象不是类变量(场),所以每个函数需要初始化,注册事件,然后调用它。 您在窗体加载这样做,但不能在按钮的点击。

或者说,看你的代码,你通过使用方法变量同名的隐藏表单中的负载领域。

这应该很好地工作:

useofdelegates.Class1 ob;
private void button1_Click(object sender, EventArgs e)
{
ob.fire();
}

private void Form1_Load(object sender, EventArgs e)
{
ob = new useofdelegates.Class1();
ob.myevent+=new useofdelegates.Class1.mydelegate(ob_myevent);
}

您还需要检查委托对象不为null调用它在定义该事件,并委托前级:

if (myevent != null)
myevent(this,ee);

线程安全的版本是这样的:

mydelegate eventcopy = myevent;
if (eventcopy != null)
eventcopy(this,ee);

你被重新声明它作为一个的Form_Load局部变量隐藏成员声明为肥胖。 下面是它的方式应该是:

private void Form1_Load(object sender, EventArgs e)
{
ob = new useofdelegates.Class1();
ob.myevent+=new useofdelegates.Class1.mydelegate(ob_myevent);
// ob.fire();
}

你可能得到一个关于这个华林从你的编译器。 它总是一个好主意,试图消除编译器警告。

分类:C# 时间:2012-01-01 人气:0
本文关键词: C#
分享到:

相关文章

  • 在C#中扩展枚举 2012-01-01

    我想知道我是否可以延长枚举类型在C#来实现我的自定义Enum.GetValues​​(型),并调用它像Enum.GetMyCustomValues​​(类型) 我想实现这样的事情: public static bool IsFlagSet<T>(this T value, T flag) where T : Enum { return (value & flag) != (T)0; } 但它不能这样做......任何变通我能做什么? 干杯 --------------解决方案-----

  • PHP客户端和C#服务器 - 不沟通,由于超时 2012-01-01

    我是相当新的Socket编程,但这里不用什么. 我一直试图做一个C#服务器和PHP客户端之间的一些简单的TCP通信. 不过,我曾在让他们之间的连接没有运气. 我基本上经由PHP socket通信的Web浏览器发送一个桌面应用程序的消息. 不过,我不断收到超时错误. 我的代码如下: 我的C#代码服务器-它只是简单地聆听,并通知我,如果建立连接 static void Main(string[] args) { try { IPAddress localAddress = IPAddress.Par

  • C#如何获得元素的宽度 2012-01-01

    有没有一种方法,我可以做jQuery的的equivilant var myElementWidth = $('.class').width; 在C#和存储它作为一个变量,以备后用. 任何指针将受到欢迎. --------------解决方案------------- 正如一些评论指向,如果位置和大小的客户端,C#情况,服务器端代码永远不会知道一些特定元素的实际尺寸和位置. 但是,如果这是宽为Web应用程序非常重要,也许你可以设置客户端呈现一些异步操作页面只是在此之后的价值. 我要说的是,这样做的

  • 如何关闭*多显示*在C#? 2012-01-01

    有关于"如何关闭监视器在C#"的文章很多,但他们都关掉所有的监视器. 有没有关闭特定监视器任何可能的方式? --------------解决方案------------- 研究一点点导致我在这里: http://www.codeguru.com/forum/showthread.php?p=1011720#post1011720 你知道如何调用一个函数一样,在C#中? - 编辑 貌似这家伙所做的这一切为你: http://www.codeproject.com/KB/dotnet/Di

  • 如何包装无的WinForms的DataGridViewTextBoxCell(C#),空格或换行符长文本? 2012-01-01

    如何包装无空格或换行符长文本DataGridViewTextBoxCell的WinForms的(C#)? private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if ((e.ColumnIndex == 1) && (e.FormattedValue != null)) { SizeF sizeGraph = e.Graphics.MeasureString

  • 基于常数值强制C#编译器错误 2012-01-01

    我有一个C#类中定义的私有const int的. 我想编译失败与错误,如果这个INT模3的值!= 0,我怎样才能做到这一点? --------------解决方案------------- 蒂莫西·扈利几乎得到了它. 它应该是这样的: int compilerError = 1 / (MY_CONST % 3 == 0 ? 1 : 0); 虽然产生编译时错误的#ERROR预处理器指令,也没有办法为它基于对一个const值的存在. 只带编译符号的作品,如"DEBUG",为它的值不能进行分

  • 用C#模仿批处理文件 2012-01-01

    我有一个运行四个命令的批处理文件 vsinstr -coverage hello.exe vsperfcmd /start:coverage /output:run.coverage hello vsperfcmd /shutdown 如何使用C#来运行四个命令? --------------解决方案------------- 运行使用的Process.Start的命令. 例 使用覆盖Process.Start(string fileName, string arguments) Process

  • 无法在F#扩展运营商? 2012-01-01

    module FSharp= let Point2d (x,y)= Point2d(x,y) let Point3d (x,y,z)= Point3d(x,y,z) type NXOpen.Point3d with static member ( * ) (p:Point3d,t:float)= Point3d(pX*t,pY*t,pZ*t) static member ( * ) (t:float,p:Point3d)= Point3d(pX*t,pY*t,pZ*t) static membe

  • 如何通过C#中添加自定义的控制,我们的表格 2012-01-01

    我使用Visual Studio 2008(WPF / C#). 我创建了一个自定义的控制,并将其添加为我的项目的引用. 现在我想动态添加通过代码背后(C#),即自定义控件. 任何人都帮我出的这些. --------------解决方案------------- 这是,你可以通过一些谷歌上搜索发现动辄基本的东西. 不管怎么说参考http://arcanecode.com/2007/09/07/adding-wpf-controls-progrrammatically/这link..it 5可以帮

  • 什么办法让一个BITMAPV5HEADER在C#中的位图对象 2012-01-01

    有没有什么办法让一个BITMAPV5HEADER在C#中的位图对象? 或者只是得到了在他们的价值观? 我需要得到一些ColorSpace中的信息进行位图,并不能看到一个办法做到这一点在C#. --------------解决方案------------- 似乎没有成为一个简单的方法来做到这一点,但hackish的(也可能是非常错误的)方法是将读取原始数据,并将其转换为一个BITMAPV5HEADER结构. 结构体 [StructLayout(LayoutKind.Sequential)] pub

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.314 (s). 10 q(s)