学习活动

时间:2017-10-17 00:07:23

标签: c# visual-studio-2010

我目前正在尝试自学如何使用事件,但我似乎永远无法使一切正常运作。

具有事件编码的类如下所示:

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

我不确定我错过了什么或我哪里出错了。任何帮助将不胜感激。

2 个答案:

答案 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;