什么是Perl警告的C#等价物?

时间:2010-03-01 19:34:36

标签: c#

在Perl我可以说

use warnings;
warn "Non-fatal error condition, printed to stderr.";

C#ASP.NET中的等价物是什么?具体来说,我正在寻找的是让我的团队中的其他成员知道他们何时仍在使用已弃用的例程。它应该在运行时出现,当代码路径实际被命中时,而不是在编译时(否则它们会收到有关代码位于兼容层的警告,该代码层应该永远不会运行。)

到目前为止,我最好的选择是使用Trace,这感觉就像一个糟糕的黑客。

7 个答案:

答案 0 :(得分:6)

使用ObsoleteAttribute。在任何要标记为已弃用的方法上装饰它。他们会在错误窗口中收到警告,但应用程序仍会编译。

public class Thing
{
     [Obsolete]
     public void OldMethod() { Console.WriteLine("I'm Old"); }
}

答案 1 :(得分:4)

编辑:我没有在问题中看到你想在执行时想要它。

写出数据执行时间的问题是你需要知道在哪里写它。您的应用程序一般使用什么日志记录?基本上使用相同形式的日志记录。

我仍然赞成下面列出的编译时选项 - 但是你可以使用#pragma warn disable/restore关闭兼容性层中的特定警告,但它会让人更容易发现问题而不是希望有人读取日志文件...


旧答案

在任何类型或成员上使用[Obsolete]属性。您可以决定这最终是警告还是错误。例如:

using System;

class Test
{
    static void Main()
    {
        OldMethod();
        BadMethod();
    }    

    [Obsolete("Use something else instead")]
    static void OldMethod() {}

    [Obsolete("This would destroy your machine!", true)]
    static void BadMethod() {}
}

编译它给出:

  

Test.cs(7,9):警告CS0618:   'Test.OldMethod()'已过时:'使用   别的东西'   test.cs中(8,9):   错误CS0619:'Test.BadMethod()'是   过时了:'这会破坏你的   机!'

理想情况下,该消息应解释继续使用该方法会产生什么影响,以及建议的替代方案。

答案 2 :(得分:2)

仅供参考,有#warning directive可用于运行时警告生成;但是,[Obsolete]属性听起来更像你需要的。

答案 3 :(得分:2)

没有等同于warn的{​​{1}}处理,但是可以通过简单的__WARN__调用来完成对STDERR的打印。

那就是说,你真正要做的是标记过时或弃用的东西,其他人已经告诉你如何做到这一点。使用该方法而不是而不是将警告调用插入到您的函数中。

答案 4 :(得分:2)

您可以使用Trace.TraceWarning进行运行时过时的方法使用检测,但是您应该重新考虑您的设计并使用ObsoleteAttribute和编译时检测。

此类错误的运行时检测应该是最后的手段。

  • 如果兼容性图层是自动生成的代码,则可以在生成填充程序时检查ObsoleteAttribute并标记此类填充程序[已废弃]
  • 如果兼容性层使用反射,则可以检查ObsoleteAttribute并发出警告。
  • 如果您的兼容层是手工编码的,您可以编写一个工具,自动检查兼容层中的IL,并根据他们调用的方法标记兼容层方法[已废弃]。

在每种情况下,最好将所有过时的方法实际标记为[Obsolete],这样新代码就不会调用它们。

如果兼容性层包含调用过时方法的填充程序,并且这些填充程序也标记为[已废弃],则可以使用以下方法安全地编译它:

#pragma warning disable 618

这将在编译兼容性层时隐藏过时的警告。由于兼容性层方法也标记为[已废弃],因此您将在正确的位置收到警告。

答案 5 :(得分:1)

我认为Trace课是你最好的选择。根据您想要的侵入方式,您可以使用不同的跟踪级别甚至Fail语句(这会产生令人讨厌的断言对话框)。

private void SomeOldMethod()
{
  Trace.Fail("You shouldn't call this method"); // <-- this will bring up an assert dialog
  Trace.TraceWarning("You shouldn't call this method");
  Trace.TraceError("You shouldn't call this method");
}

答案 6 :(得分:0)

在c#中标记方法的方法是使用过时的属性,这是重载以接收消息输出(在intellisense上)和bool是否应该允许编译。我并不是100%确信这与你想要的相符,我对perl不熟悉

[Obsolete("A message",false)]