首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parameter.Checking和Roslyn

Parameter.Checking和Roslyn
EN

Stack Overflow用户
提问于 2014-04-04 17:29:17
回答 2查看 862关注 0票数 3

我已经尝试了很多方法来消除所有这些无聊的代码来检查参数:

当第三方库不支持Code-Contracts:时,您会感到不安。

代码语言:javascript
复制
public void Buy(Product product)
{
     Contract.Requires(product != null);
}

PostSharp:自定义属性。

代码语言:javascript
复制
public void Buy([NotNull] Product product)
{
}

保护-类:带有助手方法的静态类。

代码语言:javascript
复制
public void Buy(Product product)
{
     Guard.NotNull(product, "product"); // Repeat parameter name, bad for refactoring.
     Guard.NotNull(() => product); // Slow
}

手册

代码语言:javascript
复制
public void Buy(Product product)
{
     if (product == null)
     {
          throw new ArgumentNullException("product");
     }
}

不,对于roslyn的最后一个版本,可以选择编写扩展以简化验证。对于90%的情况,我检查空引用或空字符串,因此有以下内容可能是有价值的:

代码语言:javascript
复制
public void Buy(required Product product)
{
}

public void Buy(Product product)
{
     requires product
}

public void FindUser(required nonempty string name)
{
     requires nonempty name
}

所以我的问题是:

  1. 有没有任何roslyn扩展或其他后置编译器?
  2. 您知道有什么好的资源可以编写这样的自定义扩展吗?
  3. 您会使用这样的扩展吗?如果是的话,首选语法是什么。如果没有,为什么?
EN

回答 2

Stack Overflow用户

发布于 2014-04-04 17:49:37

您想要引入新关键字,这不是一个扩展。这是语言特征。

我不是百分之百确定,但是您必须修改语法,引入新的令牌和语法树节点。然后,您必须指定应该为该构造释放什么样的IL。这可不是件小事。在此之后,您将得到您自己版本的C#,以及您自己版本的C#编译器。

它只适用于使用这个版本的编译器的人。

我认为那不是个好主意。

票数 9
EN

Stack Overflow用户

发布于 2015-02-09 20:00:19

我想要一个更好的代码契约版本,它需要更快的构建,并且提供一个更干净/更有表现力的语法。

您的建议似乎并不是一个坏主意,因为这个特性已经被提出了:https://github.com/dotnet/roslyn/issues/119

我更喜欢声明中的语法,是的,我会使用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22869259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档