在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#中使用静态方法在抽象类中是新的吗?
没有。
为什么来自微软的相对现代的源代码会延续这种做法?
语境就是一切。在这种情况下,很明显CSharpSyntaxTree.ParseText
是一个工厂方法 - 它返回一个新的ParsedSyntaxTree
实例(它是CSharpSyntaxTree
的私有子类)。这是对抽象类的静态方法的完全有效使用。
我甚至会更进一步,不同意你联系的答案。抽象基类通常只是为了方便,减少代码重复并从其子类中捕获一些常见行为。在这种情况下,将常用的静态方法放在上面是有意义的。
在抽象类上允许静态方法并不新鲜,从来没有任何禁止它们的特殊规则。
我不同意这是不好的做法。如果静态方法与静态方法的概念有关,那么这是一个放置它的好地方。例如,它通常对工厂方法有意义。
我在阅读上述类的代码时的第一反应是“哦,好吧,这是一个接口定义。”
如果仅定义一个接口而没有任何功能,那么在C#中使用interface
通常比使用抽象类更好。
不,这不是一个新功能。您可以在此处查看对C#所做的更改 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history