Является ли использование статических методов в абстрактных классах новым в C #? - PullRequest
0 голосов
/ 15 февраля 2019

Просматривая исходный код Roslyn на GitHub, я наткнулся на CSharpSyntaxTree , который является открытым абстрактным классом со статическими методами.Я не видел этого раньше и хотел бы знать, является ли это новой тенденцией.

Моя первая реакция при чтении кода для указанного класса была: «О, хорошо, это определение интерфейса».Но затем, видя следующий статический метод, сбивает с толку:

    /// <summary>
    /// Produces a syntax tree by parsing the source text.
    /// </summary>
    public static SyntaxTree ParseText(
        SourceText text,
        CSharpParseOptions options = null,
        string path = "",
        CancellationToken cancellationToken = default(CancellationToken))
    {
        if (text == null)
        ...
    }

Кроме того, этот SO вопрос и ответ на него указывают, что статический метод в абстрактномкласс не хорошая практика.Если так, то почему относительно современный исходный код от Microsoft увековечил такую ​​практику?

Мой опыт работы в C ++, и я чувствую, что C ++ излишне сложен.Я не хочу, чтобы то же самое произошло с C #.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Нет, это не новая функция.Вы можете увидеть изменения, сделанные в C # здесь
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history

0 голосов
/ 15 февраля 2019

Нет ничего нового в том, чтобы разрешать статические методы в абстрактных классах, никогда не было специального правила, запрещающего их.

Я не согласен с тем, что это плохая практика.Если статический метод связан с концепцией статического метода, то это хорошее место для его использования.Это часто имеет смысл, например, для фабричных методов.

Моя первая реакция при чтении кода для указанного класса была: «О, хорошо, это определение интерфейса».

Если определяется только интерфейс без какой-либо функциональности, обычно лучше использовать interface, чем абстрактный класс в C #.

0 голосов
/ 15 февраля 2019

Является ли использование статических методов в абстрактных классах новым в C #?

Нет.

Почему относительно современный исходный код от Microsoft увековечивает такоепрактика?

Контекст - это все.В этом случае очевидно, что CSharpSyntaxTree.ParseText является фабричным методом - он возвращает новый экземпляр ParsedSyntaxTree (который является частным подклассом CSharpSyntaxTree).Это вполне допустимое использование статического метода в абстрактном классе.

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

...