我需要在我的MVC项目中实现一个HtmlHelper
扩展,只是为了输出一些字符串,但只能在DEBUG模式下输出,而不是在RELEASE中。
我的第一次尝试是:
[Conditional("DEBUG")]
public static string TestStringForDebugOnly(this HtmlHelper helper, string testString)
{
return testString;
}
但显然这会产生编译错误:
“条件属性无效,因为其返回类型不是无效。”
所以我的理解是,一旦设置了[Conditional]
属性,它就不允许返回任何内容?为什么呢?
有没有其他方法可以实现这种功能?任何帮助将不胜感激。
答案 0 :(得分:6)
您可以使用preprocessor directive:
public static string TestStringForDebugOnly(this HtmlHelper helper, string testString)
{
#if DEBUG
return "debug";
#else
return "other";
#endif
}
至于您原来的问题,请查看section 17.4.2 of the C# specification表示:
[A]条件方法的返回类型必须为
void
我只能推测为什么语言的设计者决定了这一点,但我冒昧地猜测它是因为如果条件是false
,C#编译器不会将方法调用编译成IL,所以实际上好像你从未调用过这个方法(如果预期返回值会在运行时产生一些明显的问题!)
答案 1 :(得分:1)
我不知道原始设计师最初是否考虑过这种思路,但这对我来说是有道理的。
因为你只能将方法声明为void类型并且它不能被覆盖并且它不能作为接口的一部分被引用,编译器可以简单地忽略该方法,因为如果指定的模式不匹配它将没有依赖性。如果另一个方法以非匹配模式调用它,编译器可以简单地将其视为无效的方法调用,就好像该属性不存在一样。
John的例子可行,但我会这样做:
#if DEBUG
public static string TestStringForDebugOnly(...)
{
...
}
#endif
// Arguments are only for illustration.
public string CallingMethod(int id, string temp)
{
#if DEBUG
string result = TestStringForDebugOnly(id, temp);
#else
string result = TestString(id, temp);
#endif
return result;
}
由于两个原因,我会花费额外的努力来在预处理器指令中包装所有与DEBUG相关的代码(包括单独的方法调用)。首先,它提供了自己的内置文档;你确切地知道应该在何时,何地和为什么运行。其次,如果需要修改或删除代码,则需要大量减少需要完成的搜索量,同时需要重复编译和重新编译以查看有什么中断。