我理解事件的目的,特别是在创建用户界面的环境中.我认为这是创建活动的原型:
public void EventName(object sender, EventArgs e);
Run Code Online (Sandbox Code Playgroud)
事件处理程序做了什么,为什么需要它们,以及如何创建一个?
我最近才知道C#'事件'确实是.老实说,这不是真的.综上所述我的发现:该事件的关键字很简单,只适用于委托的改性剂.
因此,事件的所有"魔力"都是代表的操作.而已.我已经阅读了很多Microsoft文档,但没有任何句子以这种方式如此简洁地总结.为了继续我的发现,委托,类和结构都处于同一"级别".它们是定义"对象"的方法.我并不是指类型中的"对象",而是"某事"的封装概念.就像在面向对象编程时使用"对象"这个词一样.
无论如何,'对象'有一些修饰符.例如,密封,只读,虚拟,静态等...此列表可在此处找到.在委托的情况下,它有一个名为event的额外的.事件使得当委托被声明为类的一部分时,它只根据给予事件的访问修饰符公开add和remove方法.这些方法的定义与获取和设置属性的性质类似.委托的其他操作(赋值,读访问,方法调用等)仅允许在声明事件委托的类中.我感兴趣的另一件事是,所有委托都有方法Invoke,BeginInvoke和EndInvoke,但你无法导航到在Visual Studio中查看它们,也无法找到描述它们的文档......
好的.因此,在了解了所有这些之后,除了修改委托的访问方式之外,使用event关键字有什么好处?看起来,在许多情况下,我最好只是声明一个没有event关键字的委托.我最近遇到的一种情况是我想创建一个包含2个事件的抽象基类.从这个基类派生的任何类都应该能够使用类似于它们自己的事件,类似于暴露给派生类的类的任何其他对象(也就是非私有的,除非派生类在另一个程序集,并且对象被声明为内部).
基本上,我希望派生类将这些事件用作自己的事件.执行此操作的唯一方法是将事件的支持变量公开为受保护,因此派生类可以引发事件.看看代码,这看起来很愚蠢,因为我基本上定义了两次委托; 曾经作为一个受保护的领域,另一个作为公共事件.我想,
在构造函数中创建一个名为Event的类,并且在构造函数中有一个Action参数,我会不会更好?返回的操作等同于许多人作为委托的扩展方法所做的提升,它检查委托是否为空,然后调用委托.Event上唯一的公共方法是Add和Remove,用于追加委托并从底层委托中删除它们(+ =, - =).类可以将这些事件作为属性,例如,
public Event SomethingHappened { get; private set; }
Run Code Online (Sandbox Code Playgroud)
这样只有那个类才能重新分配事件.或者公共只读字段也同样有效.从构造函数返回的out参数由类存储,并在类想要引发事件时调用.我知道这是一个很好的解决方法,但它会完成工作,并允许事件不仅作为参数传递,而且允许派生类在基类将其定义为受保护时调用Raise方法.
TLDR:
我想知道代表们的目的是什么.我没有那么多地使用它们,也不能真正想到什么.
在我的课程中,有人写道,代表是符合其签名的所有方法的蓝图.
此外,您可以向一个委托添加多个方法,然后按照添加顺序在彼此之后执行它们.这可能仅对影响局部变量的方法或不返回任何值的方法有用.
我已经读过C#将Events实现为委托,记录为:
//Summary: Represents the method that
will handle an event that has no event
data.
//Parameters:
//sender: The source of the event.
//e: An System.EventArgs that contains no event data.
[Serializable]
[ComVisible(true)]
public delegate void EventHandler(object sender, EventArgs e);
Run Code Online (Sandbox Code Playgroud)
不过,这有点令人困惑.有人可以给出这个概念的一个好的,有用的例子吗?
我有一个用户控件来处理fileupload.我已经定义了一个委托如下
public delegate void FileUploadSuccess<T>(T value,FileUploadType F)
Run Code Online (Sandbox Code Playgroud)
value可以是字符串也可以是字节数组.FileUploadType是一个枚举,它告诉上传了哪种类型的文件.
现在我在usercontrol中声明了一个事件来提高它.
public event FileUploadSuccess<string> successString; //In case I want a file name
public event FileUploadSuccess<Byte[]> successStringImage; // In case I want a byte[] of uploaded image
Run Code Online (Sandbox Code Playgroud)
我想要的是一般事件
public event FileUploadSuccess<T> successString.
Run Code Online (Sandbox Code Playgroud) 我在很多项目中都使用过活动和代表,但我仍然怀疑在项目中使用事件和代表的地方以及委托和事件之间的区别.任何人都可以解释一下吗?
我最近参加了C#的采访,在那里我被问到一个关于C#中的事件和代表的问题
这个人问我一个事件说按钮被点击,这被称为第一个事件或代表?
委托是否调用事件或事件调用委托?
我们可以在c#中没有代表的情况下举办活动吗?
我花了几天时间试图理解WPF和MVVM.它的进展非常缓慢,主要是因为我在事件和事情方面缺乏知识.在这里,我将尝试解释我对所有这些事情的理解:
方法 - 这个很简单,我认为不需要任何解释.任何计划的基本要素.
委托 - 我看到的方式是方法指针.我只想到几个应用程序,我想在方法上使用它.
行动 - 那个甚至更棘手.我设法找到的信息说它是一个不返回值的委托......所以它只是指向void方法的指针吗?我没有看到这一点
事件 - 这个我根本没有得到.这是与代表解释,我不明白它是如何工作的,它是什么.注意我正在使用写winforms应用程序的事件,但它只是从列表中选择所需的事件.
事件处理程序 - 更加不清楚.
Lambda表达式 - 也是使用方法的另一种方式.我再次理解它不会返回任何内容,我可以在其中传递一些参数,但仍然与void方法有很大不同.我看过一些应用程序,比如使用LINQ但我仍然不明白它是如何工作的.
我想先说我了解MVVM的基本构造,做什么等等.问题是我不了解一些代码,它是如何工作的,因此我不能自己写任何东西.我将使用一些教程作为示例,所以在这里:
S1:https://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030
S2:http://social.technet.microsoft.com/wiki/contents/articles/18199.event-handling-in-an-mvvm-wpf-application.aspx
我期待你们的是一些指导或解释我如何处理和理解那些想法让他们至少对我来说不那么可怕.在这里,我将举一些例子,希望能告诉你我遇到了什么样的问题.
1)第一个来自着名的RelayCommand类的S1:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)
我知道它应该做什么(名字不言自明).但我不明白这件事是如何运作的?它是如何知道何时制作可执行文件的,何时不是.那些添加和删除"命令"的是什么?我试着阅读它,但它没有帮助.
2)另一个例子形式S1:
#region CloseCommand
/// <summary>
/// Returns the command that, when invoked, attempts
/// to remove this workspace from the user interface.
/// </summary>
public ICommand CloseCommand
{
get
{
if …Run Code Online (Sandbox Code Playgroud) 是
public event Action delt = () => { Console.WriteLine("Information"); };
Run Code Online (Sandbox Code Playgroud)
一个重载版本
Action<int, int> delg = (a, b) => { Console.WriteLine( a + b); }; ?
Run Code Online (Sandbox Code Playgroud)
我的意思是Action <> delegate是"事件动作"的重载版本?
我真的在理解事件和委托的概念.我知道委托是持有方法引用的对象,可以调用具有相同返回类型和参数的方法,但那么究竟是什么事件?
如果我需要使用事件来制作一个简单的计算器,那么我该如何使用它们以便有3个事件:一个可以用于数字,一个用于操作符,另一个用于相等或结果操作.
我在.NET中设计win表单时使用过代理...即拖放按钮,双击,然后填写myButton_click事件.我想了解如何在C#中创建和使用用户定义的委托.
如何在C#中使用和创建用户定义的委托?