第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

另一個(gè)類中的動(dòng)作委托引用?

另一個(gè)類中的動(dòng)作委托引用?

C#
瀟瀟雨雨 2022-10-23 13:45:21
我正在尋找一種方法來(lái)允許另一個(gè)類通過(guò)調(diào)用該類的方法向我的 Action 委托添加方法,而不是在第一個(gè)類上調(diào)用 Action。這就是我需要的:class Program{    static void Main(string[] args)    {        Action Execute = delegate { };        ProgramTest prog = new ProgramTest(ref Execute);        prog.AddMethod();        Execute();    }}class ProgramTest{    public Action execute;    public ProgramTest(ref Action action)    {        execute = action;    }    public void AddMethod()    {        execute += Print;    }    public void Print()    {        Console.WriteLine("test");        Console.ReadLine();    }}但是,當(dāng)我調(diào)用 Execute() 時(shí),什么也沒(méi)有發(fā)生。我怎樣才能讓它工作?
查看完整描述

4 回答

?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

另一種選擇是將(不可變的)委托放在可變?nèi)萜髦小?/p>


public class ActionContainer

{

    public Action Action { get; set; } = () => { };

}


class Program

{

    static void Main(string[] args)

    {

        ActionContainer execute = new ActionContainer();


        ProgramTest prog = new ProgramTest(execute);


        prog.AddMethod();


        execute.Action();

    }

}


class ProgramTest

{

    public ActionContainer execute;


    public ProgramTest(ActionContainer action)

    {

        execute = action;

    }


    public void AddMethod()

    {

        execute.Action += Print;

    }


    public void Print()

    {

        Console.WriteLine("test");

        Console.ReadLine();

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊

你想要的是這樣的:


class Program

{

    static void Main(string[] args)

    {

        Action Execute = delegate { };


        ProgramTest prog = new ProgramTest(h => Execute += h);


        prog.AddMethod();


        Execute();

    }

}


class ProgramTest

{

    public Action<Action> execute;


    public ProgramTest(Action<Action> action)

    {

        execute = action;

    }


    public void AddMethod()

    {

        execute(Print);

    }


    public void Print()

    {

        Console.WriteLine("test");

        Console.ReadLine();

    }

}

打印test到控制臺(tái)。


這是這個(gè)模式的一個(gè)稍微好一點(diǎn)的版本:


class Program

{

    static void Main(string[] args)

    {

        Action Execute = delegate { };


        ProgramTest prog = new ProgramTest(h => Execute += h, h => Execute -= h);


        var subscription = prog.AddMethod();


        Execute();


        subscription.Dispose();

    }

}


class ProgramTest

{

    public Action<Action> _attach;

    public Action<Action> _detach;


    public ProgramTest(Action<Action> attach, Action<Action> detach)

    {

        _attach = attach;

        _detach = detach;

    }


    public IDisposable AddMethod()

    {

        _attach(Print);

        return Disposable.Create(() => _detach(Print));

    }


    public void Print()

    {

        Console.WriteLine("test");

        Console.ReadLine();

    }

}


public sealed class Disposable : IDisposable

{

    public static IDisposable Create(Action action)

        => new Disposable(action);


    private readonly Action _action;

    private int _disposed;


    private Disposable(Action action)

    {

        _action = action;

    }


    public void Dispose()

    {

        if (Interlocked.Exchange(ref _disposed, 1) == 0)

        {

            _action();

        }

    }

}

我什至?xí)M(jìn)一步并定義一個(gè)MetaAction- 您可以隨意傳遞它并向其添加方法。


class Program

{

    static void Main(string[] args)

    {

        Action Execute = delegate { };


        MetaAction meta = MetaAction.Create(h => Execute += h, h => Execute -= h);


        var prog = new ProgramTest(meta);


        var subscription = prog.AddMethod();


        Execute();


        subscription.Dispose();

    }

}


public class MetaAction

{

    public static MetaAction Create(Action<Action> attach, Action<Action> detach)

        => new MetaAction(attach, detach);


    public Action<Action> _attach;

    public Action<Action> _detach;


    private MetaAction(Action<Action> attach, Action<Action> detach)

    {

        _attach = attach;

        _detach = detach;

    }


    public IDisposable Subscribe(Action action)

    {

        _attach(action);

        return Disposable.Create(() => _detach(action));

    }

}


public class ProgramTest

{

    public MetaAction _meta;


    public ProgramTest(MetaAction meta)

    {

        _meta = meta;

    }


    public IDisposable AddMethod()

    {

        return _meta.Subscribe(Print);

    }


    public void Print()

    {

        Console.WriteLine("test");

        Console.ReadLine();

    }

}


public sealed class Disposable : IDisposable

{

    public static IDisposable Create(Action action)

        => new Disposable(action);


    private readonly Action _action;

    private int _disposed;


    private Disposable(Action action)

    {

        _action = action;

    }


    public void Dispose()

    {

        if (Interlocked.Exchange(ref _disposed, 1) == 0)

        {

            _action();

        }

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以通過(guò)調(diào)用 prog.Execute 而不是 Execute 來(lái)使其工作,就像下面的代碼一樣。


class Program

{

    static void Main(string[] args)

    {

        Action Execute = delegate { };

        ProgramTest prog = new ProgramTest(ref Execute);

        prog.AddMethod();

        prog.execute();

    }

}

或者您需要將 Print 方法分配給 main 方法執(zhí)行委托,如下所示


class Program

{

    static void Main(string[] args)

    {

        Action Execute = delegate { };            

        ProgramTest prog = new ProgramTest(ref Execute);


        Execute += prog.Print;


        prog.AddMethod();


        Execute();


    }

}


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
qq_花開(kāi)花謝_0

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊

您Program可能會(huì)公開(kāi)一個(gè)事件,您的其他類可能會(huì)向該事件注冊(cè)另一個(gè)處理程序:


class Program

{

    public static event Action MyEvent;

    static void Main(string[] args)

    {

        ProgramTest prog = new ProgramTest();


        prog.AddMethod();


        // raise the event and invoke the registered handlers

        MyEvent?.Invoke();

    }

}


class ProgramTest

{

    private Action handler;


    public ProgramTest()

    {

        handler = Print;

    }


    public void AddMethod()

    {

        Program.MyEvent += handler;  // regsiter the execute-delegate to the event

        // or directly: Program.MyEvent += Print;

    }


    public void Print()

    {

        Console.WriteLine("test");

        Console.ReadLine();

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 4 回答
  • 0 關(guān)注
  • 140 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)