Кодовые блоки Objective-C эквивалентны в C # - PullRequest
13 голосов
/ 28 апреля 2011

Как бы я написал эквивалентный код на C #:

typedef void (^MethodBlock)(int); 

- (void) fooWithBlock:(MethodBlock)block
{
    int a = 5;
    block(a);
}

- (void) regularFoo
{
    [self fooWithBlock:^(int val) 
    {
        NSLog(@"%d", val);
    }];
}

Ответы [ 2 ]

16 голосов
/ 28 апреля 2011

Примерно так:

void Foo(Action<int> m)
{
    int a = 5;
    m(a);
}

void RegularFoo()
{
    Foo(val => // Or: Foo(delegate(int val)
    {
        Console.WriteLine(val);
    });
}

Action<T> - это делегат, который принимает ровно один аргумент указанного вами типа (в данном случае, int), который выполняетничего не возвращая.Также см. Общую ссылку на делегат C # .

. Для такого простого случая это довольно просто.Однако я полагаю, что между блоками в Objective-C и делегатами в C # существуют некоторые семантические / технические различия, которые, вероятно, выходят за рамки этого вопроса.

1 голос
/ 28 апреля 2011
void fooWithBlock(Action<int> block)
{
   int a = 5;
   block(a);
}
...