读书人

嘱托只能指向事件吗

发布时间: 2013-09-05 16:02:07 作者: rapoo

委托只能指向事件吗?
需求很简单,运行窗口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);
事件在外部只能注册或者取消 ,调用只能是事件类自己调用。

读书人网 >C#

热点推荐