C# 参数。正在与Roslyn核对
我已经尝试了很多东西来摆脱所有这些无聊的代码来检查参数: 代码契约:当第三方库不支持它时,会让您感到不安C# 参数。正在与Roslyn核对,c#,parameter-passing,roslyn,C#,Parameter Passing,Roslyn,我已经尝试了很多东西来摆脱所有这些无聊的代码来检查参数: 代码契约:当第三方库不支持它时,会让您感到不安 public void Buy(Product product) { Contract.Requires(product != null); } PostSharp:自定义属性 public void Buy([NotNull] Product product) { } 保护类:带有帮助器方法的静态类 public void Buy(Product product) {
public void Buy(Product product)
{
Contract.Requires(product != null);
}
PostSharp:自定义属性
public void Buy([NotNull] Product product)
{
}
保护类:带有帮助器方法的静态类
public void Buy(Product product)
{
Guard.NotNull(product, "product"); // Repeat parameter name, bad for refactoring.
Guard.NotNull(() => product); // Slow
}
手册:
public void Buy(Product product)
{
if (product == null)
{
throw new ArgumentNullException("product");
}
}
否对于roslyn的最新版本,可以选择编写扩展来简化验证。对于90%,我会检查空引用或空字符串,因此使用以下内容可能很有价值:
public void Buy(required Product product)
{
}
public void Buy(Product product)
{
requires product
}
public void FindUser(required nonempty string name)
{
requires nonempty name
}
所以我的问题是:
你想引入新的关键字,这不是一个扩展。这是一种语言特征 我不是100%确定,但您必须修改语法,引入新的令牌和语法树节点。然后,您必须指定应该为该构造发出何种IL。这不是一件小事。然后你会得到你自己的C#版本,还有你自己的C#编译器版本 它只适用于使用此版本编译器的用户
我认为这不是一个好主意。我喜欢更好的代码契约版本,它需要更快地构建,并提供更清晰/更具表达力的语法 您的建议似乎不是一个坏主意,因为已经提出了以下功能:
我更喜欢声明中的语法,是的,我会使用它。此外,Roslyn明确表示无法为语言添加功能。(虽然现在它是开源的,你可以破解它——但是Marcin是正确的,那将是一个坏主意)@KirkWoll嗯,Roslyn API(我认为这是视频的主题)不是。但是我认为编译器的开源是完全不同的