首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

嘱托只能指向事件吗

2013-09-05 
委托只能指向事件吗?需求很简单,运行窗口1,直接弹出窗口2,并改变窗口2的某个label的text疑问有2, 请看代码

委托只能指向事件吗?
需求很简单,运行窗口1,直接弹出窗口2,并改变窗口2的某个label的text
疑问有2, 请看代码注释。
直接上代码:


//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public event Change change;
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            change("123");
        }
    }


//窗口1执行窗口2的委托
public partial class Form3 : Form
    {
        public Form2()
        {
            InitializeComponent();

            Form3 f = new Form3();
            f.change += new Change(f_ChangeColor);
            f.Show();
        }

        void f_ChangeColor(string str)
        {
            this.Text = str;   //this 如何指向我需求的那个label
        }
    }


[解决办法]
方法也是可以的呀
[解决办法]
chang是个类型,你不能直接用这个类型
而要他的实例

[解决办法]
返回类型,参数类型个数一样的方法 ,都可以委托。
delegate double MathAction(double num); 



class DelegateTest
{
    static double Double(double input)
    {
        return input * 2;
    }

    static void Main()
    {
        MathAction ma = Double;

        double multByTwo = ma(4.5);
        Console.WriteLine("multByTwo: {0}", multByTwo);

        MathAction ma2 = delegate(double input)
        {
            return input * input;
        };

        double square = ma2(5);
        Console.WriteLine("square: {0}", square);

        MathAction ma3 = s => s * s * s;
        double cube = ma3(4.375);

        Console.WriteLine("cube: {0}", cube);
    }

}


[解决办法]
MS提供event关键字,主要就是进一步将委托封装,方便控制委托链
+=是将一个方法注册到事件的委托链上
-=则是移除
对于一个event这两个操作符都只能在类里面使用
[解决办法]
//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}

你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话
------解决方案--------------------


引用:
Quote: 引用:

返回类型,参数类型个数一样的方法 ,都可以委托。
[/code]


谢谢您的回复,
这个是在同一个类中调用,
如果在另外一个类中应该如何调用呢?
单独只定义 
delegate double MathAction(double num);

并不能在其他类访问到 MathAction
声明public 是可以的。
[解决办法]
引用:
Quote: 引用:

//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}

你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话



哦, 了解了, 我思想太僵化了。
不知这样理解是否正确:



//如果
public delegate void Change(string str);
public event Change change; 
//调用change 需要有个事件的实例

//如果
public delegate void Change(string str);
//调用change 需要有方法的实例
Change change = new Change(DoSomeThing);


是的,其实两者都是在做同一件事情,都是指向一个匹配的可执行方法
[解决办法]
引用:
Quote: 引用:

//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();


            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}


你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话



哦, 了解了, 我思想太僵化了。
不知这样理解是否正确:



//如果
public delegate void Change(string str);
public event Change change; 
//调用change 需要有个事件的实例

//如果
public delegate void Change(string str);
//调用change 需要有方法的实例
Change change = new Change(DoSomeThing);
事件在外部只能注册或者取消 ,调用只能是事件类自己调用。

热点排行