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

时间:2019-02-15 12:32:52

标签: c# abstract-class static-methods roslyn

在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表示抽象类中的静态方法不是一种好习惯。如果是这样,为什么Microsoft的相对较现代的源代码可以永久保留这种做法?

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

3 个答案:

答案 0 :(得分:2)

  

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

否。

  

为什么来自Microsoft的相对较现代的源代码可以延续这种做法?

上下文就是一切。在这种情况下,显然f_out.var是工厂方法-它返回一个新的def wrapper(func): def wrapped(*args, **kwargs): wrapped.orig = func # keeps a ref to the original function func.var = 0 ret = func(*args, **kwargs) print(func.var) return wrapped @wrapper def f_out(): f_out.var = 1 f_out() print(f_out.var, f_out.orig.var) 实例(它是0 1 0 的私有子类)。这是对抽象类的静态方法的完全有效使用。

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

答案 1 :(得分:0)

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

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

  

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

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

答案 2 :(得分:-2)

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