在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#发生同样的事情。
答案 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