C# 募捐活动似乎有所改变

C# 募捐活动似乎有所改变,c#,.net,events,.net-4.5,C#,.net,Events,.net 4.5,在以前版本的.NET(我想是3)中,我使用类似这样的东西来引发一个带有自定义EventArgs public delegate void NewTitleEventArgs(object sender, string title); public event NewTitleEventArgs NewTitle; public class NewTitleEventArgs : EventArgs //Class used to pass data to event consumers whe

在以前版本的.NET(我想是3)中,我使用类似这样的东西来引发一个带有自定义
EventArgs

public delegate void NewTitleEventArgs(object sender, string title);
public event NewTitleEventArgs NewTitle;

public class NewTitleEventArgs : EventArgs //Class used to pass data to event consumers when sending notification.
{
    public readonly string NewTitle;
    public NewTitleEventArgs(string Title)
    {
        NewTitle = Title;
    }
} 
不过,我现在似乎只需要这样做:

public delegate void NewTitleEventArgs(object sender, string title);
public event NewTitleEventArgs NewTitle;

完全无视课堂。这是标准还是新事物

第二个示例也不是新的,它已经存在,第一个示例用于在代理上实现您自己的事件参数

e、 g

公共活动NewTitleEventArgs NewTitle


然后,您需要实现自己的MyCustomArgment事件参数

您的第二个示例也不是新的,它已经存在,第一个示例用于在代理上实现自己的事件参数

e、 g

公共活动NewTitleEventArgs NewTitle


然后,您需要实现自己的MyCustomArgment事件参数

您的第一个示例没有多大意义,无法编译。您正在用相同的名称声明两个类型(一个委托和一个类都称为
NewTitleEventArgs
),这是不允许的

您的第二个示例编译并运行良好,它将在C#到C#1.0的所有版本中编译。但是它不符合,所以你不应该写这样的代码

一致性模式是创建一个继承自
EventArgs
的类,并将其用作委托的第二个参数

您可以这样写(我还修复了代码中的一些其他样式问题):

自C#2.0(2005年发布)以来,您还可以使用通用的
EventHandler
委托类型,以避免为每个事件args类型声明新的委托类型:

public class NewTitleEventArgs : EventArgs
{
    public string NewTitle { get; private set; }

    public NewTitleEventArgs(string title)
    {
        NewTitle = title;
    }
} 

public event EventHandler<NewTitleEventArgs> NewTitle;
公共类NewTitleEventArgs:EventArgs
{
公共字符串NewTitle{get;private set;}
公共NewTitleEventArgs(字符串标题)
{
新标题=标题;
}
} 
公共事件处理程序NewTitle;

您的第一个示例没有多大意义,无法编译。您正在用相同的名称声明两个类型(一个委托和一个类都称为
NewTitleEventArgs
),这是不允许的

您的第二个示例编译并运行良好,它将在C#到C#1.0的所有版本中编译。但是它不符合,所以你不应该写这样的代码

一致性模式是创建一个继承自
EventArgs
的类,并将其用作委托的第二个参数

您可以这样写(我还修复了代码中的一些其他样式问题):

自C#2.0(2005年发布)以来,您还可以使用通用的
EventHandler
委托类型,以避免为每个事件args类型声明新的委托类型:

public class NewTitleEventArgs : EventArgs
{
    public string NewTitle { get; private set; }

    public NewTitleEventArgs(string title)
    {
        NewTitle = title;
    }
} 

public event EventHandler<NewTitleEventArgs> NewTitle;
公共类NewTitleEventArgs:EventArgs
{
公共字符串NewTitle{get;private set;}
公共NewTitleEventArgs(字符串标题)
{
新标题=标题;
}
} 
公共事件处理程序NewTitle;

我想我知道你在说什么,是的,发生了变化。在和更早的版本中,
EventHandler
的定义是

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)
where TEventArgs : EventArgs
这将允许订阅成员

public void myObject_NewTitle(object sender, string title)
{
   //...
}

我想我知道你在说什么,是的,有一个变化。在和更早的版本中,
EventHandler
的定义是

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)
where TEventArgs : EventArgs
这将允许订阅成员

public void myObject_NewTitle(object sender, string title)
{
   //...
}

不要让一些
EventArgs
包装器(其中包含您的标题)作为唯一的成员。

不确定您的意思,因为第一个示例无法编译,您也没有引发事件,只声明了它。但是,
EventHandler
的声明删除了.NET 4.5中的
T:EventArgs
约束(如果您正在讨论的话)。如果没有类定义,代码将无法编译。这肯定没有改变。@CamBruce相反,如果类存在,代码就不会编译,因为它声明了两个同名的类型(委托和类)。等等。。。既能编译又能工作!我在其他地方提到了这件事——这是我所看到的定义,而不是召唤。@Mike z是的,Mike——这就是我所说的——谢谢。将您的注释更改为答案,您就得到了要点不确定您的意思,因为第一个示例无法编译,并且您没有引发事件,只是声明了它。但是,
EventHandler
的声明删除了.NET 4.5中的
T:EventArgs
约束(如果您正在讨论的话)。如果没有类定义,代码将无法编译。这肯定没有改变。@CamBruce相反,如果类存在,代码就不会编译,因为它声明了两个同名的类型(委托和类)。等等。。。既能编译又能工作!我在其他地方提到了这件事——这是我所看到的定义,而不是召唤。@Mike z是的,Mike——这就是我所说的——谢谢。将您的注释更改为答案,您就得到了要点在
EventHandler
中有一个新的更改,不再需要
T
。你现在可以在第二个论点中使用任何类。@ScottChamberlain有趣,我不知道(我不知怎么错过了mike z的评论)。但我怀疑这就是问题所在,它甚至没有提到
EventHandler
。在
EventHandler
中有一个新的变化,
t
不再是必需的。你现在可以在第二个论点中使用任何类。@ScottChamberlain有趣,我不知道(我不知怎么错过了mike z的评论)。但我怀疑这就是问题所在,它甚至没有提到
EventHandler
public void myObject_NewTitle(object sender, string title)
{
   //...
}