Seb*_*hle 3 c# parameter-passing roslyn
我已经尝试了很多东西来摆脱所有这些无聊的代码来检查参数:
代码合约:当第三方库不支持时,您会感到紧张.
public void Buy(Product product)
{
Contract.Requires(product != null);
}
Run Code Online (Sandbox Code Playgroud)
PostSharp:自定义属性.
public void Buy([NotNull] Product product)
{
}
Run Code Online (Sandbox Code Playgroud)
Guard-Class:带有辅助方法的静态类.
public void Buy(Product product)
{
Guard.NotNull(product, "product"); // Repeat parameter name, bad for refactoring.
Guard.NotNull(() => product); // Slow
}
Run Code Online (Sandbox Code Playgroud)
手册:
public void Buy(Product product)
{
if (product == null)
{
throw new ArgumentNullException("product");
}
}
Run Code Online (Sandbox Code Playgroud)
对于最后一个版本的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
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题:
您想引入新关键字,这不是扩展程序.这是一种语言功能.
我不是100%肯定,但你必须修改语法,引入新的令牌和语法树节点.然后,您必须指定应该为该构造发出何种IL.这不是一件小事.之后您将获得自己的C#版本,以及您自己的C#编译器版本.
它只适用于使用此版本编译器的人.
我不认为这是个好主意.