繁体   English   中英

C#中是否在抽象类中使用静态方法?

[英]Is the use of static methods in abstract classes new in C#?

在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 问题及其答案表明,抽象类中的静态方法不是一种好习惯。 如果是这样,为什么Microsoft的相对较现代的源代码将使这种做法永存呢?

我的背景是C ++,我觉得C ++不必要地复杂。 我不想看到C#发生同样的事情。

C#中是否在抽象类中使用静态方法?

没有。

为什么Microsoft会提供相对较现代的源代码来延续这种做法?

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

我什至走得更远,不同意您链接的答案。 抽象基类通常只是为了方便起见,以减少代码重复并从其子类中捕获一些常见行为。 在这种情况下,将常见的静态方法放在上面是有意义的。

在抽象类上允许使用静态方法并不是什么新鲜事,从来没有任何特别的规则禁止它们。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM