Delegates, Actions, and Memory Allocations

I am currently working on a piece of code that requires minimal memory allocations.

I noticed that if I use a method for a parameter, the compiler modifies the code and creates a new action. But if I use the anonymous method, the compiler creates a delegate block, I know that the new action allocates memory, but I'm not sure about this. Will delegates allocate memory when used?

My code

 bool workfinished = false;
    void DoWork()
    {

    MyMethod(  CallBack1Work ,()=>{ workfinished = false;});

    }

    void MyMethod(Action callback1 ,Action callback2)
    {

    }

    void CallBack1Work()
    {

    }

Compiler version

bool workfinished = false;


        void DoWork{

        MyMethod( new Action( CallBack1Work ),delegate{ 
                                                      workfinished = false; 
                                                       });

        }
        void MyMethod(Action callback1 ,Action callback2)
        {

        }

        void CallBack1Work()
        {

        }

        void DoWork_b01()
        {
             workfinished = false;
        }

Thanks in advance!

+4
source share
2 answers

, ​​ new SomeDelegate , lambda, delegate , . . , , ; , . (, null , - , , .)

, (workfinished). , , , , , . (, , .)

+7

, , . , Action Action<YourClass> this. :

class YourClass
{
    private bool workFinished;

    public void DoWork()
    {
        MyMethod(instance => instance.Callback1Work(),
                 instance => instance.workFinished = false);
    }

    private void MyMethod(Action<YourClass> callback1,
                          Action<YourClass> callback2)
    {
        // Do whatever you want here...
        callback1(this);
        // And here...
        callback2(this);
    }

    private void Callback1Work()
    {
       // ...
    }
}

DoWork . .

, . :

class YourClass
{
    private static readonly Action<YourClass> Callback1 = x => x.Callback1Work();
    private static readonly Action<YourClass> Callback2 = x => x.workFinished = false;

    private bool workFinished;

    public void DoWork()
    {
        MyMethod(Callback1, Callback2);
    }

    ... code as before ...
}

, .

Action, - , DoWork , :

class YourClass
{
    private readonly Action foo;
    private readonly Action bar;

    private bool workFinished;

    public YourClass()
    {
        foo = Callback1Work;
        bar = () => workFinished = false;
    }

    public void DoWork()
    {
        MyMethod(foo, bar);
    }

    public void MyMethod(Action callback1, Action callback2)
    {
        ...
    }

    private void Callback1Work()
    {
        ...
    }
}
+7

All Articles