Каково точное значение метода делегата () в C #? - PullRequest
0 голосов
/ 27 декабря 2018

Я довольно новичок в C # (я пришел с Java) и работаю над проектом SharePoint.

У меня есть следующие сомнения, связанные с этим методом в моем коде:

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
    lock (this)
    {
        try
        {
            SPSecurity.RunWithElevatedPrivileges(delegate ()
            {
                SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
                DeleteExistingJob(JobName, parentWebApp);
            });
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

, как вы можете видеть, этот код выполняется в делегат () {...}"блок":

SPSecurity.RunWithElevatedPrivileges(delegate ()
{
    SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
    DeleteExistingJob(JobName, parentWebApp);
});

Что именно означает это делегат () метод?

Чтение здесь: https://docs.microsoft.com/it-it/dotnet/csharp/language-reference/keywords/delegate

мне кажется, что это что-то вроде способа объявить "анонимный" метод, где реализация этого методаэто код в блоке {...} .

Это правильная интерпретация или я что-то упустил?

В случае, если это правильно, что такое заливкаэтого делегата () метода?Почему я не объявляю код классическим методом?Что это такое?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

мне кажется, что это что-то вроде способа объявить "анонимный" метод, в котором реализация этого метода представляет собой код в блоке {...}.

Да, это так!

В случае, если это правильно, каков результат применения этого метода делегата ()?Почему я не объявляю код классическим методом?Что такое точная заливка?

Поскольку вы упомянули, что пришли из Java, вы можете думать о передаче delegate(){ ... } как передаче анонимного класса в Java в некоторой степени.

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

Например, в Java до JDK8 вы могли бы сделать:

btn.setOnAction(new EventHandler<ActionEvent>() {  //<--- implementation
        @Override
        public void handle(ActionEvent event) {
             System.out.println("Hello World!");
        }
  });

или начиная с JDK8:

btn.setOnAction(e -> System.out.println("Hello World!"));

Аналогично в C # delegate () {...} позволяет вам передавать реализацию, то есть некоторое поведение на лету.

Некоторое время назад было обычным делом использовать delegate () {...}, но сейчасВы, скорее всего, будете использовать лямбда-эквивалент () => { ... }


. Вы можете найти следующие интересные посты:

0 голосов
/ 27 декабря 2018

В соответствии с документацией, на которую вы ссылались, ключевое слово delegate используется для двух целей:

  • Чтобы объявить тип делегата
  • Чтобы создать анонимный метод , который преобразуется в экземпляр делегата

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

Так вот почему вы должны использовать анонимный метод - или что-нибудь в C # 3 и далее, вы, скорее всего, будете использовать лямбда-выражение .

Подумайте, как вам нужно создать делегата в вашем примере, если вы не используетеанонимный метод или лямбда-выражение.Вам нужно написать что-то вроде этого:

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
    lock (this)
    {
        // Note: try/catch removed as it's pointless here, unless you're
        // *trying* to obscure the stack trace in case of an exception
        JobDeletionHelper helper = new JobDeletionHelper(properties);
        // Note that we're using a method group conversion here - we're not
        // invoking the method. We're creating a delegate which will invoke
        // the method when the delegate is invoked.
        SPSecurity.RunWithElevatedPrivileges(helper.DeleteJob);
    }
}
// We need this extra class because the properties parameter is *captured*
// by the anonymous method
class JobDeletionHelper
{
    private SPFeatureReceiverProperties properties;

    internal JobDeletionHelper(SPFeatureReceiverProperties properties)
    {
        this.properties = properties;
    }

    public void DeleteJob()
    {
        // This is the code that was within the anonymous method
        SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
        DeleteExistingJob(JobName, parentWebApp);
    }
}

Если вы спрашиваете о цели самих делегатов, это немного большая тема - но в двух словах, это возможность представлять исполняемый код какобъект, поэтому он может быть передан другому коду для выполнения.(Вы можете думать о типе делегата как об интерфейсе с одним методом, если это полезно.)

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