在C#中使用静态方法在抽象类中是新的吗?

问题描述 投票:0回答:3

在GitHub上浏览Roslyn源代码时,我遇到了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 question和它的answer表明抽象类中的静态方法不是好的做法。如果是这样,为什么来自微软的相对现代的源代码会延续这种做法呢?

我的背景是C ++,我觉得C ++是不必要的复杂。我不希望C#发生同样的事情。

c# abstract-class static-methods roslyn
3个回答
2
投票

在C#中使用静态方法在抽象类中是新的吗?

没有。

为什么来自微软的相对现代的源代码会延续这种做法?

语境就是一切。在这种情况下,很明显CSharpSyntaxTree.ParseText是一个工厂方法 - 它返回一个新的ParsedSyntaxTree实例(它是CSharpSyntaxTree的私有子类)。这是对抽象类的静态方法的完全有效使用。

我甚至会更进一步,不同意你联系的答案。抽象基类通常只是为了方便,减少代码重复并从其子类中捕获一些常见行为。在这种情况下,将常用的静态方法放在上面是有意义的。


0
投票

在抽象类上允许静态方法并不新鲜,从来没有任何禁止它们的特殊规则。

我不同意这是不好的做法。如果静态方法与静态方法的概念有关,那么这是一个放置它的好地方。例如,它通常对工厂方法有意义。

我在阅读上述类的代码时的第一反应是“哦,好吧,这是一个接口定义。”

如果仅定义一个接口而没有任何功能,那么在C#中使用interface通常比使用抽象类更好。


-2
投票

不,这不是一个新功能。您可以在此处查看对C#所做的更改 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history

© www.soinside.com 2019 - 2024. All rights reserved.