#define DEBUG using System; using System.Diagnostics; class Class1 { [Conditional("DEBUG")] public static void M() { Console.WriteLine("Executed Class1.M"); } } class Class2 { public static void Test() { Class1.M(); } }declares Class1.M as a conditional method. Class2's Test method calls this method. Since the conditional compilation symbol DEBUG is defined, if Class2.Test is called, it will call M. If the symbol DEBUG had not been defined, then Class2.Test would not call Class1.M. end example] Paragraph 41 It is important to note that the inclusion or exclusion of a call to a conditional method is controlled by the conditional compilation symbols at the point of the call. [Example: In the example
// Begin class1.cs using System; using System.Diagnostics; class Class1 { [Conditional("DEBUG")] public static void F() { Console.WriteLine("Executed Class1.F"); } } // End class1.cs // Begin class2.cs #define DEBUG class Class2 { public static void G() { Class1.F(); // F is called } } // End class2.cs // Begin class3.cs #undef DEBUG class Class3 { public static void H() { Class1.F(); // F is not called } } // End class3.csthe classes Class2 and Class3 each contain calls to the conditional method Class1.F, which is conditional based on whether or not DEBUG is defined. Since this symbol is defined in the context of Class2 but not Class3, the call to F in Class2 is included, while the call to F in Class3 is omitted. end example] Paragraph 51 The use of conditional methods in an inheritance chain can be confusing. 2 Calls made to a conditional method through base, of the form base.M, are subject to the normal conditional method call rules. [Example: In the example
// Begin class1.cs using System; using System.Diagnostics; class Class1 { [Conditional("DEBUG")] public virtual void M() { Console.WriteLine("Class1.M executed"); } } // End class1.cs // Begin class2.cs using System; class Class2: Class1 { public override void M() { Console.WriteLine("Class2.M executed"); base.M(); // base.M is not called! } } // End class2.cs // Begin class3.cs #define DEBUG using System; class Class3 { public static void Test() { Class2 c = new Class2(); c.M(); // M is called } } // End class3.csClass2 includes a call to the M defined in its base class. This call is omitted because the base method is conditional based on the presence of the symbol DEBUG, which is undefined. Thus, the method writes to the console "Class2.M executed" only. Judicious use of pp-declarations can eliminate such problems. end example]
| |
Jagger Software Ltd | |
Company # 4070126 | |
VAT # 762 5213 42 |