В какой ситуации использовать концепцию делегата в C #? - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь изучить концепцию делегата в 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;
    }
}

}

Ответы [ 3 ]

0 голосов
/ 03 февраля 2012

Что касается использования делегатов для обработки событий, то для него существует общее решение, начиная с .NET 2.0

.

EventHandler<TEventArgs>

Обработка событий с использованием этого не требует явного использования новых делегатов.

Этого объявления события достаточно:

event EventHandler<ChangePasswordEventArgs> ChangingPassword;

В вашем коде при создании события вы должны проверить подписчиков:

void changePass_Click(object sender, EventArgs e)
{

    if(ChangePasswordEvent != null)
        ChangePasswordEvent(sender, 
            new ChangePasswordEventArgs(newPassText.Text, this));
}   

Если вы не проверяете подписчиков и их нет, событие выдает исключение. В многопоточном приложении вы должны использовать вместо этого .


Что касается общего использования для делегатов, «сырой» делегат редко используется напрямую, но события, лямбды и деревья выражений используют делегатов в качестве основного механизма. Единственное прямое использование делегатов, которое я сделал, - это обработка событий и асинхронные операции с использованием шаблона Begin / EndInvoke .

См. в этой статье для объяснения делегатов, лямбд и анонимных методов.

0 голосов
/ 10 января 2013

Спасибо, Мейсам. Он прокомментировал мой вопрос с очень полезной ссылкой в ​​отношении делегатов. Теперь у меня есть четкое представление о делегатах, а также о EventArgs. Вот ссылка,

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

Надеюсь, это поможет и другим.

0 голосов
/ 03 февраля 2012

Вы можете увидеть хороший пример использования делегатов в лямбда-выражениях. Он часто используется в LINQ.

Взгляните сюда: Лямбда-выражения и деревья выражений

Также вы можете обратиться к этой записи.

Приведенный вами пример относится к категории Обработчики событий (для графического интерфейса и более)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...