我正在尝试研究c#中的委托概念。
我在学习时做了代表的样本。但我没有理解我们有效使用其概念的正确情况。 任何人都可以建议一个易于理解的情况,我们使用代表。
我知道代表们的工作。但是在它有效使用的地方仍然没有清除。
我在下面发布了我的代码。如果我在样本中犯了任何错误,请告诉我。
提前谢谢。
ChangePassword.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ChangePassword.ascx.cs" Inherits="User_Controls_ChangePassword" %>
<div style="width:500px;clear:both;">
<div style="width:100%; clear:both;">
<div style="width:150px; float:left;">
<asp:Label ID="newPassword" runat="server" Text="New Password"></asp:Label>
</div>
<div style="width:100px; float:left;">
<asp:TextBox ID="newPassText" runat="server" Width="200"></asp:TextBox>
</div>
</div>
<div style="width:100%; clear:both;padding-top:20px;">
<div style="width:150px; float:left;">
<asp:Label ID="Label1" runat="server" Text="Confirm New Password"></asp:Label>
</div>
<div style="width:100px; float:left;">
<asp:TextBox ID="confirmNewPass" runat="server" Width="200"></asp:TextBox>
</div>
</div>
<div style="width:100%; clear:both;padding-top:20px;">
<div style="width:150px; float:left;">
<asp:Label ID="Label2" runat="server" Text=" "></asp:Label>
</div>
<div style="width:207px; float:left;">
<div style="float:left;">
<asp:Button ID="changePass" runat="server" Text="Change" />
</div>
<div style="float:right;">
<asp:Button ID="cancelButton" runat="server" Text="Cancel" />
</div>
</div>
</div>
<div style="width:100%; clear:both;padding-top:20px;">
<div style="width:350px; float:left;">
<asp:Label ID="successMessage" runat="server" Text="Passwords Changed.." ForeColor="Red" Font-Bold="true" Visible="false"></asp:Label>
</div>
</div>
ChangePassword.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class User_Controls_ChangePassword : System.Web.UI.UserControl
{
public delegate void ChangePasswordDelegate(object sender, ChangePasswordEventArgs e);
public event ChangePasswordDelegate ChangePasswordEvent;
protected void Page_Load(object sender, EventArgs e)
{
changePass.Click += new EventHandler(changePass_Click);
}
void changePass_Click(object sender, EventArgs e)
{
ChangePasswordEvent(sender, new ChangePasswordEventArgs(newPassText.Text, this) );
}
}
public class ChangePasswordEventArgs : EventArgs
{
private string _newPassword = "";
private object _parent = null;
public string NewPassword
{
get
{
return _newPassword;
}
set
{
_newPassword = value;
}
}
public object Parent
{
get
{
return _parent;
}
set
{
_parent = value;
}
}
public ChangePasswordEventArgs()
{ }
public ChangePasswordEventArgs(string pass , object parent)
{
_newPassword = pass;
_parent = parent;
}
}
Default.aspx的
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagName="ChangePasword" TagPrefix="MY" Src="~/User Controls/ChangePassword.ascx" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<MY:ChangePasword ID="passControl" runat="server" />
</asp:Content>
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
passControl.ChangePasswordEvent += new User_Controls_ChangePassword.ChangePasswordDelegate(passControl_ChangePasswordEvent);
}
void passControl_ChangePasswordEvent(object sender, ChangePasswordEventArgs e)
{
if (e.Parent != null)
{
User_Controls_ChangePassword cp = (User_Controls_ChangePassword)e.Parent;
cp.FindControl("successMessage").Visible = true;
}
}
}
答案 0 :(得分:0)
您可以在lambda表达式中看到一个使用委托的好例子。它在LINQ中经常使用。
看看这里:Lambda Expressions and Expression Trees
您也可以参考this发帖。
您提供的示例是类别事件处理程序(用于GUI等)
希望它有所帮助!
答案 1 :(得分:0)
关于使用委托进行事件处理,自.NET 2.0以来就有一个通用的解决方案
使用此处理事件不需要明确使用新代理。
此事件声明已足够:
event EventHandler<ChangePasswordEventArgs> ChangingPassword;
在举办活动时,您应该检查订阅者:
void changePass_Click(object sender, EventArgs e)
{
if(ChangePasswordEvent != null)
ChangePasswordEvent(sender,
new ChangePasswordEventArgs(newPassText.Text, this));
}
如果您没有检查订阅者并且没有订阅者,则该事件将引发异常。在多线程应用程序中,您应该使用this approach代替。
关于委托的一般用法,“raw”委托很少直接使用,但事件lambdas和表达式树使用委托作为底层机制。我所代表的唯一直接用途是事件处理和async operations using the Begin/EndInvoke pattern。
有关委托,lambdas和匿名方法的说明,请参阅this article。
答案 2 :(得分:0)
谢谢Meysam。他就一个关于代表的非常有用的链接评论了我的问题。现在我对代表以及EventArgs有了清晰的认识。这是链接,
http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified
希望它也能帮助别人。