我尝试了以下代码:
class Magic {
[Conditional("DEBUG")]
public static void DoMagic( int stuff )
{
}
public static int ComputeMagic()
{
throw new InvalidOperationException();
}
}
class Program
{
static void Main(string[] args)
{
Magic.DoMagic(Magic.ComputeMagic());
}
}
Run Code Online (Sandbox Code Playgroud)
并且看起来在Release版本中没有抛出异常,因此不仅ConditionalAttribute删除了对标记为的方法的调用,而且还消除了参数计算.
这种行为有保证吗?
我试图通过使用Conditional属性来摆脱我的代码中的"#if TRACE"指令,但是不能轻易地将这种方法应用于接口.我有一个方法,但它很丑,我正在寻找一个更好的解决方案.
例如,我有一个带有条件编译方法的接口.
interface IFoo
{
#if TRACE
void DoIt();
#endif
}
Run Code Online (Sandbox Code Playgroud)
我不能在接口中使用条件属性:
// Won't compile.
interface IFoo
{
[Conditional("TRACE")]
void DoIt();
}
Run Code Online (Sandbox Code Playgroud)
我可以让接口方法在具体类中调用一个条件私有方法:
interface IFoo
{
void TraceOnlyDoIt();
}
class Foo : IFoo
{
public void TraceOnlyDoIt()
{
DoIt();
}
[Conditional("TRACE")]
void DoIt()
{
Console.WriteLine("Did it.");
}
}
Run Code Online (Sandbox Code Playgroud)
这将使我的客户端代码在非TRACE构建中对"nop"TraceOnlyDoIt()方法进行冗余调用.我可以通过接口上的条件扩展方法来解决这个问题,但它有点难看.
interface IFoo
{
void TraceOnlyDoIt();
}
class Foo : IFoo
{
public void TraceOnlyDoIt()
{
Console.WriteLine("Did it.");
}
}
static class FooExtensions
{
[Conditional("TRACE")]
public static void DoIt(this IFoo foo) …Run Code Online (Sandbox Code Playgroud) 是否有可能创建2个具有相同方法名称的方法,传入值并使用条件属性返回并返回一些反条件
[Conditional("Debug")]
private string StringGenerator()
{
Guid g = Guid.NewGuid();
string guidString = Convert.ToBase64String(g.ToByteArray());
guidString = guidString.Replace("=", "");
guidString = guidString.Replace("+", "");
return guidString;
}
[!Conditional("Debug")]// I know using '!' doesn't really work
private string StringGenerator()
{
Guid g = Guid.NewGuid();
string guidString = Convert.ToBase64String(g.ToByteArray());
return guidString;
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以调用一个方法,并根据是否定义了"Debug",编译器会选择哪种方法?
谢谢
我查看ConditionalAttribute声明,它声明如下:
我发现JavaScript代码是这样的:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
AllowMultiple = true)]
public sealed class ConditionalAttribute : Attribute {
//whatever
}
Run Code Online (Sandbox Code Playgroud)
并AttributeTargets.Class声称该属性可以应用于一个类.所以我试过这个:
[Conditional("DEBUG")]
class MyClass
{
}
Run Code Online (Sandbox Code Playgroud)
但编译器发出以下错误
错误CS1689:属性'System.Diagnostics.ConditionalAttribute'仅对方法或属性类有效
和MSDN说
只有ConditionalAttribute属性才会出现此错误.如消息所述,此属性只能用于方法或属性类.例如,尝试将此属性应用于类将生成此错误.
所以看起来有一个属性声明适用于类但是尝试将它应用于类会导致编译错误.
这怎么可能?这是一些硬连线的特殊情况还是什么?