我有两个.cs文件。我正在尝试在此项目中使用事件委托。 Event.cs:
ClassNotFound
Form1.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Project3
{
public delegate int Calculate(int obj1, int obj2);
public class Event
{
public event Calculate CalculateNow;
int a = 0;
int b = 0;
int r = 0;
public int Add()
{
r = a + b;
return r;
}
public int Sub()
{
r = a - b;
return r;
}
public int Mul()
{
r = a * b;
return r;
}
public int Div()
{
r = a / b;
return r;
}
}
}
我收到一条错误说“当前上下文中不存在名称't_CalculateNow'”,我不知道如何纠正它。希望有人能回答我。非常感谢!如果有人能够解释事件代表的逻辑,那将对我有所帮助。
答案 0 :(得分:1)
您的代码缺少正确的事件初始化和使用。事件不能直接从其他类调用,但是可以创建为公共订阅者调用它的方法(在我们的例子中是InvokeCalc方法)。它看起来像这样的shoukd为你工作:
public class Calculator
{
public event Calculate CalculateNow;
public delegate int Calculate(int x, int y);
public string InvokeCalc(int x, int y)
{
if(CalculateNow != null) return CalculateNow(x, y).ToString();
return null;
}
}
然后在你的winform中你可以使用它:
namespace Project3
{
public partial class Form1 : Form
{
private Calculator calc;
public Form1()
{
InitializeComponent();
calc = new Calculator();
label1.Text = "";
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
label1.Text = btn.Text;
int num1 = Int32.Parse(textBox1.Text);
int num2 = Int32.Parse(textBox2.Text);
// subscribes a handler to your event
calc.CalculateNow += (n1, n2) => { return n1 + n2; }
// method that invokes your event on Calculator class
int finalr = calc.InvokeCalc(num1, num2);
if (finalr != null)
{
label1.Text = "" + finalr;
}
else
{
label1.Text = "Error!";
}
}
}
}
P.S。 虽然这是一个例子,说明了如何使用事件,但你不太可能以这种方式使用事件。通常,事件应该用于通知订阅者(其他类)发生了事件。事件只能从类内部触发,并且某种类型的封装可以提高应用程序的完整性,因为否则 ANY 类或结构可以触发此事件,并且很难找出实际上哪个类调用它和... ...
答案 1 :(得分:0)
我认为你对事件和代表没有很好的理解。我想在你的Form1
课程中,你想订阅CalculateNow
课程中的Event
事件。你正在做这个事情,直到这个t_CalculateNow
字。发生错误是因为实际上t_CalculateNow
在任何地方都不存在。您应该将此方法添加到表单类:
private int t_CalculateNow (int obj1, int obj2) {
//do whatever you want when the event occurs in here
}
然而,我知道这不是你要实现的目标。你想计算一些东西并将其归还。所以你甚至不需要一个事件或一个委托,你只需要一个静态的方法。
public static int Calculate (int obj1, int obj2) {
//do your calculation here and return the result
}
您可以使用它来设置标签的文字:
label1.Text = Event.Calculate (0, 0); //0, 0 is just an example, do whatever you need.
对代表的引用:https://msdn.microsoft.com/en-us/library/900fyy8e(v=vs.120).aspx