我目前正在尝试自学如何使用事件,但我似乎永远无法使一切正常运作。
具有事件编码的类如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventsPractice
{
public delegate void myEventHandler(string newValue);
public class EventExample
{
private string _value;
public event myEventHandler valueChanged;
public string val
{
set
{
_value = value;
valueChanged(_value);
}
}
static void myEvt_valueChanged(string newValue)
{
Console.WriteLine("The value changed to {0}", newValue);
}
}
}
我的程序类看起来像这样:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EventsPractice;
namespace EventsPractice
{
public class Program
{
static void Main(string[] args)
{
EventExample myEvt = new EventExample();
myEvt.valueChanged += myEventHandler(myEvt_valueChanged);
string str;
do
{
str = Console.ReadLine();
if (!str.Equals("exit"))
myEvt.val = str;
} while (!str.Equals("exit"));
}
}
}
我收到的错误是:
"错误1' EventsPractice.myEventHandler'是一种'类型'但用作变量' C:\ Users \ Administrator \ Documents \ Visual Studio 2010 \ Projects \ EventsPractice \ EventsPractice \ Program.cs 15 35 EventsPractice"
错误2名称' myEvt_valueChanged'在当前上下文中不存在C:\ Users \ Administrator \ Documents \ Visual Studio 2010 \ Projects \ EventsPractice \ EventsPractice \ Program.cs 15 50 EventsPractice
我不确定我错过了什么或我哪里出错了。任何帮助将不胜感激。
答案 0 :(得分:1)
订阅事件的语法要求您在myEventHandler(myEvt_valueChanged);
运算符的右侧提供委托对象的实例。表达式myEvt_valueChanged
根本没有意义,更不用说它是否提供必要的委托实例。
另一个问题是标识符new
本身并不有效,您尝试使用它。该名称的方法在一个完全不同的类中声明,因此如果要在该类之外使用它,则必须通过类名限定。这样编译器就可以知道在哪里找到方法。
更改代码的最简单方法是添加myEvt.valueChanged += new myEventHandler(EventExample.myEvt_valueChanged);
运算符,如下所示:
myEventHandler
这将使用myEvt_valueChanged
类中的方法EventExample
显式创建new
委托类型的实例。但是,C#提供了一种更简洁的语法,它将基于表达式的左侧代表您推断委托类型和myEvt.valueChanged += EventExample.myEvt_valueChanged;
运算符:
myEvt_valueChanged
请注意,当您以这种方式编写它时,它仍然完全相同,就像您明确地编写了整个内容一样。只是编译器为你填写了明显的部分。
最后,我将指出事件最常用于从声明事件的同一个类订阅方法而不是。如果Program
类在myEvt.valueChanged += myEvt_valueChanged;
类中,那么上面的示例将更为典型,如果它在那里,则在订阅事件时您不需要指定类名:
- webapp
- app
- app.module.ts
- package.json
-webpack.config.js
答案 1 :(得分:0)
在+=
的右侧,您必须放置一个与delegate
具有相同签名的方法(或lambda),类似于:
myEvt.valueChanged += (val) => { Console.WriteLine("Value is now {0}", val); }
或
private void SomeMethod(string val) {
Console.WriteLine("Value is now {0}", val);
}
myEvt.valueChanged += SomeMethod;