Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数。正在与Roslyn核对_C#_Parameter Passing_Roslyn - Fatal编程技术网

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
}
所以我的问题是:

  • 是否有roslyn扩展或其他后期编译器
  • 你知道有什么好资源可以编写这样的自定义扩展吗
  • 您会使用这样的扩展吗?如果会,首选的语法是什么。若否,原因为何

  • 你想引入新的关键字,这不是一个扩展。这是一种语言特征

    我不是100%确定,但您必须修改语法,引入新的令牌和语法树节点。然后,您必须指定应该为该构造发出何种IL。这不是一件小事。然后你会得到你自己的C#版本,还有你自己的C#编译器版本

    它只适用于使用此版本编译器的用户


    我认为这不是一个好主意。

    我喜欢更好的代码契约版本,它需要更快地构建,并提供更清晰/更具表达力的语法

    您的建议似乎不是一个坏主意,因为已经提出了以下功能:


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

    此外,Roslyn明确表示无法为语言添加功能。(虽然现在它是开源的,你可以破解它——但是Marcin是正确的,那将是一个坏主意)@KirkWoll嗯,Roslyn API(我认为这是视频的主题)不是。但是我认为编译器的开源是完全不同的