【问题标题】:Define own keywords and meanings定义自己的关键字和含义
【发布时间】:2016-03-31 13:27:39
【问题描述】:

是否可以在 C# 中定义关键字?
我的意思是像

public important Form newform;

important 将是新关键字。例如,如果类型为null,则在编译时会发生错误。所以这个例子会产生一个错误。一个没有错误的例子是

public important Form newform = form1;

【问题讨论】:

  • 是的,不,是的,你可以做到,但不像你展示的那样。您将使用属性和代码处理器,如 PostSharp、Fody 或 CodeContracts。
  • 在空检查的情况下,你可以使用code contracts
  • 正如 Scott 所提到的,寻找自定义属性。关键字是编译器的方向——除非你自己写!
  • 您可以构建自己的 Roslyn 版本,或者使用属性并编写代码检查。
  • form1 仍然可以为空。一般来说,这样的分析是不可判定的,你不能可靠地静态验证空引用。

标签: c# compilation compiler-errors keyword


【解决方案1】:

不,您不能按照您指定的方式创建新关键字。我建议你看看这个。

Create new keyword for C# automatic property

【讨论】:

    【解决方案2】:

    不,编译器不允许您直接添加关键字。

    这并不意味着你不能完成你想要的,但这将是不平凡的。您将需要执行自己的自定义静态代码分析。

    罗斯林

    一种方法是通过新的 .NET 编译器服务 (Roslyn) 代码分析器。您可以阅读这篇 MSDN 文章开始:https://msdn.microsoft.com/en-us/magazine/dn879356.aspx,您最终会得到如下所示的内容:

    这将在 Visual Studio 中工作,您至少可以生成警告,我也会假设错误(或者您必须打开“将警告视为错误”)。

    因为您想以声明方式将检查添加到某些变量,您需要使用Attributes

    /// <summary> Indicate a variable must be given a value 
    /// in the same line it's declared </summary>
    public class ImportantAttribute : Attribute {}
    
    public class Program
    {
       [Important]
       object thisShouldError;
    
       object thisIsFine;
    }
    

    然后,当您编写分析器时,您需要检查变量声明节点,看它是否被 Important 修饰。

    如果您希望它在构建服务器(或 VS 之外)上工作,您可能需要做更多工作:Roslyn: workspace loads in console application but not in msbuild task

    风格警察

    最简单的方法可能是使用代码分析(即 StyleCop)针对您的代码库运行静态分析规则集:

    你需要编写你自己的规则集,我不知道规则集是否会给你保真度,以便能够声明你想要强制检查的变量声明,即我不知道是否你可以混合搭配这个:

    public class Program
    {
       [Important]
       object thisShouldError;
    
       object thisIsFine;
    }
    

    福迪

    另一种方法是使用像Fody 这样的IL 编织工具,它可以让您在编译期间操作应用程序的IL。 AFAIK 您不能直接生成编译错误,但您可以添加无效的 IL,这反过来会生成编译时错误。

    因此,基于与上述相同的代码,在使用 Fody 编译通过后,您最终会得到如下代码:

    public class Program
    {
       [Important]
       object thisShouldError YouForgotToInitializeThisImportantVariable;
    
       object thisIsFine;
    }
    

    自定义编译器

    微软确实开源了 C# 编译器:https://github.com/dotnet/roslyn。因此,如果您真的有野心,您绝对可以在自己的编译器分支中添加自己的关键字。当然,您基本上将拥有自己的语言,并且除了您的自定义编译器之外,它将无法编译任何其他语言。

    【讨论】:

      【解决方案3】:

      也许您可以简单地使用 ReSharper 之类的工具...定义新关键字仅用于查找未初始化的公共变量听起来是个坏主意。

      【讨论】:

      • 这只是一个示例,我实际上不需要它,仍然感谢您的帮助!
      • 您必须用汇编语言编写 1 到 2 年的时间来治疗这些想法。那么当前的 C# 功能看起来会非常强大和有用 :) 请记住:如果编程变得非常简单,工资就会下降,这很糟糕!
      【解决方案4】:

      简短:不,你不能。

      Long:这是可能的,但它可能永远不会发生,因为您需要 C# 团队添加它,但这需要大量讨论和大量可行的用途它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        • 2012-01-09
        • 2021-12-12
        • 2015-08-03
        • 2018-05-17
        • 2022-01-18
        相关资源
        最近更新 更多