Когда Вы используете дополнительные методы, методы расширения по сравнению с наследованием?

Делегированные разрешения имеют значение только при вызове API в контексте пользователя.

Поскольку вы используете учетные данные клиента, пользователь отсутствует. Применяются только разрешения приложения, поэтому установите правильные разрешения там.

Кроме того, поскольку у вас есть асинхронная функция, лучше также дождаться токена:

var authenticationResult = await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
48
задан GEOCHET 27 April 2009 в 21:04
поделиться

3 ответа

Методы расширения позволяют расширять существующие классы, не полагаясь на наследование или изменяя исходный код класса. Это означает, что если вы хотите добавить некоторые методы в существующий класс String, вы можете сделать это довольно легко. Вот пара правил, которые следует учитывать при принятии решения о том, использовать или нет методы расширения:

  • Методы расширения нельзя использовать для переопределения существующих методов

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

  • Концепция методов расширения не может быть применена к полям, свойствам или событиям.

  • Используйте методы расширения экономно ... чрезмерное использование может быть плохим!

24
ответ дан 26 November 2019 в 18:43
поделиться

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

Если вы не используете , метод расширения может быть полезен.

Я часто использую методы расширения для перечислений [Flags]. Если у вас есть перечисление на основе флагов, существует довольно большое выражение, необходимое для определения, имеет ли значение перечисления определенный установленный флаг. И поэтому я создаю следующий метод расширения при построении перечисления [Flags]:

[Flags]
public enum MyEnum
{
    FlagA,
    FlagB,
    // etc.
}

public static class MyEnumExt
{
    public static bool HasFlags(this MyEnum item, MyEnum query)
    {
        return ((item & query) == query);
    }
}

Таким образом мой код выглядит следующим образом:

MyEnum flags = MyEnum.FlagA;
if(flags.HasFlags(MyEnum.FlagA))
{
  // handle FlagA
}

Вместо:

MyEnum flags = MyEnum.FlagA;
if((flags & MyEnum.FlagA) == MyEnum.FlagA)
{
  // handle FlagA
}
7
ответ дан 26 November 2019 в 18:43
поделиться

раз использовать методы расширения:

  • когда вы не управляете расширяемыми типами
  • , где вы не хотите заставлять разработчика предоставлять код, который может быть выполнен с использованием существующих методов

Для примера второй точки ; у вас может быть метод расширения для IList (например, Sort ), который может быть полностью записан с использованием существующих членов IList .. , так зачем кому-то еще что-то писать? Это основной блок LINQ, который позволил Microsoft предоставить гораздо больше функциональных возможностей, ничего не нарушая.

Времена до не используют методы расширения:

  • , когда полиморфизм является критическим; Вы не можете гарантировать, что ваш код будет той версией, которая выполняется с помощью метода расширения, поскольку методы непосредственно для типа имеют приоритет
  • , когда вам нужен доступ к закрытым / защищенным членам
58
ответ дан 26 November 2019 в 18:43
поделиться