【问题标题】:In which situation to use the Delegate concept in C#?在什么情况下使用 C# 中的委托概念?
【发布时间】:2012-02-03 10:50:03
【问题描述】:

我正在尝试研究 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="&nbsp;"></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;
    }
}

}

【问题讨论】:

  • 阅读this
  • 谢谢。这是一篇关于代表的好文章。

标签: asp.net delegates


【解决方案1】:

您可以看到在 lambda 表达式中使用委托的一个很好的例子。它在 LINQ 中经常使用。

看这里:Lambda Expressions and Expression Trees

也可以参考this的帖子。

您提供的示例属于类别事件处理程序(用于 GUI 等)

希望对你有帮助!

【讨论】:

    【解决方案2】:

    关于使用委托进行事件处理,自 .NET 2.0 起就有一个通用的解决方案

    EventHandler&lt;TEventArgs&gt;

    使用 this 处理事件不需要显式使用新的委托。

    这个事件声明就够了:

    event EventHandler<ChangePasswordEventArgs> ChangingPassword;
    

    在您的代码中引发事件时,您应该检查订阅者:

    void changePass_Click(object sender, EventArgs e)
    {
    
        if(ChangePasswordEvent != null)
            ChangePasswordEvent(sender, 
                new ChangePasswordEventArgs(newPassText.Text, this));
    }   
    

    如果您不检查订阅者并且没有订阅者,则该事件将引发异常。在多线程应用程序中,您应该改用this approach


    关于委托的一般用途,“原始”委托很少直接使用,但事件、lambdas 和表达式树使用委托作为底层机制。我对委托的唯一直接用途是用于事件处理和async operations using the Begin/EndInvoke pattern

    请参阅 this article 了解委托、lambda 和匿名方法的说明。

    【讨论】:

      【解决方案3】:

      谢谢梅萨姆。他用一个非常有用的关于代表的链接评论了我的问题。现在我对委托和 EventArgs 有了一个清晰的认识。这是链接,

      http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified

      希望它也能帮助其他人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多