在编译时显示与C#中的方法实现相关的自定义警告

时间:2017-03-21 08:57:25

标签: c# .net

在当前上下文中,我们有两种方法Start和Stop。这两个方法是从函数顺序调用的。一个人可能有机会在他的方法中调用Start()但忘记调用Stop()。 e.g。

private void A()
{
  Start();

  //Buisness logic goes here

}

在这种情况下编译代码时,需要显示警告或错误,通知每个Start()应该有一个相应的Stop()。有人可以提出如何在C#中实现相同的想法吗?

正确的实施方式是

private void A()
{
  Start();

  //Buisness logic goes here

  Stop();

}

3 个答案:

答案 0 :(得分:2)

我建议您更改模式以处理StartStop,而不会将其暴露给程序员。

更改实施Start&的班级Stop代替实施Execute方法,甚至不公开Start& Stop

public class MyClass
{
    private void Start(){} // old public method
    private void Stop(){} // old public method

    public void Execute(Action action)
    {
         Start();
         action();
         Stop();
    }
}

用法:

var impl = new MyClass();
impl.Execute(() => {
   // do something in between start & stop
});

答案 1 :(得分:1)

Evk提供了一个很好的提示,以下是我将如何更详细地做到这一点:

  1. 有一个类(例如StartStop)实现IDisposable

    public class StartStop : IDisposable
    {
        public StartStop() {  Start(); }
    
        public void Dispose() { Stop(); }
    
        protected void Start() { /*...*/ }
    
        protected void Stop() { /*...*/ }
    }
    
  2. 将此课程与using

    一起使用
    private void A()
    {
        using( var startStopCaller = new StartStopCaller() )
        {
            // Your code here
        }
     }
    
  3. using将确保Dispose()以及随后Stop()将被调用,除非发生严重崩溃。

答案 2 :(得分:0)

这可以通过多种方式来解决,主要有两个方向:

  • 如果您使用的是.NET平台的更高版本,以及Roslyn编译器(Defaults from VS2015 and onwards),您可以考虑编写一个编译器插件来为您检查。以下是一些资源:
  • 正如您所提到的一些评论所指出的,这可以在您的代码和程序设计中修复。 这很可能是解决这个问题的“正确”方法。一些例子:
    • 考虑implementing IDisposable并在using statement中使用您的课程 - 但请记住,此处停止和处置对象可能不一样。你应该根据你对程序内部运作的了解,对此做出明智的决定。
    • 如果您从其他地方调用这些类,则可以让它们实现包含StartStop方法的界面。然后让调用类简单地将它们视为此接口,并确保它调用这两种方法,无论它使用哪种实现。
    • 重新设计代码,使其不依赖于依次运行Start()和Stop()。这可能需要对程序及其工作方式进行基本的设计更改,但这可能是值得的。两者都具有可读性和可维护性。