Freigeben über


Switch-Klasse

Stellt eine abstract-Basisklasse bereit, um neue Schalter für Debuggen und Ablaufverfolgung zu erstellen.

Namespace: System.Diagnostics
Assembly: System (in system.dll)

Syntax

'Declaration
Public MustInherit Class Switch
'Usage
Dim instance As Switch
public abstract class Switch
public ref class Switch abstract
public abstract class Switch
public abstract class Switch

Hinweise

Schalter stellen einen effizienten Mechanismus dar, mit dem anhand externer Einstellungen Ablaufverfolgungs- und Debugausgaben zur Laufzeit gesteuert werden können. Die Switch-Klasse implementiert das Standardverhalten für Schalter und ermöglicht Ihnen somit das Ändern der Schalterebene zur Laufzeit.

Diese Klasse ist die Basisklasse für die BooleanSwitch-Klasse, die SourceSwitch-Klasse und die TraceSwitch-Klasse. Die hiermit verfügbaren Schalter sind für die meisten Aufgaben beim Debuggen und der Ablaufverfolgung ausreichend. Wenn Sie eigene Schalter erstellen, müssen diese static sein.

Sie müssen die Ablaufverfolgung oder das Debuggen aktivieren, um einen Schalter zu verwenden. Die folgende Syntax ist compilerspezifisch. Wenn Sie einen anderen Compiler als C# oder Visual Basic verwenden, finden Sie entsprechende Informationen in der Dokumentation zum Compiler.

  • Wenn Sie das Debuggen in C# aktivieren möchten, fügen Sie in der Compilerbefehlszeile beim Kompilieren des Codes das /d:DEBUG-Flag hinzu, oder fügen Sie #define DEBUG am Anfang der Datei ein. Fügen Sie in Visual Basic in der Compilerbefehlszeile das /d:DEBUG=True-Flag hinzu.

  • Wenn Sie die Ablaufverfolgung in C# aktivieren möchten, fügen Sie in der Compilerbefehlszeile beim Kompilieren des Codes das /d:TRACE-Flag hinzu, oder fügen Sie #define TRACE am Anfang der Datei ein. Fügen Sie in Visual Basic in der Compilerbefehlszeile das /d:TRACE=True-Flag hinzu.

Bearbeiten Sie zum Festlegen der Ebene des Schalters die Konfigurationsdatei, die dem Namen der Anwendung entspricht. In dieser Datei können Sie einen Schalter hinzufügen und dessen Wert festlegen, einen Schalter entfernen oder alle Schalter löschen, die zuvor durch die Anwendung festgelegt wurden. Die Konfigurationsdatei sollte wie im folgenden Beispiel formatiert werden:

<configuration>
  <system.diagnostics>
    <switches>
      <add name="mySwitch" value="10" />
      <add name="myNewSwitch" value="20" />
      <remove name="mySwitch" />
      <clear/>
    </switches>
  </system.diagnostics>
</configuration>

Hinweis

Sie können Switch-Member in der Klasse als static festlegen, um die Leistung zu erhöhen.

Hinweise für Erben Wenn Sie zusätzliche Ablaufverfolgungsebenen oder Mechanismen zum Festlegen von Schalterebenen benötigen, die nicht über BooleanSwitch, SourceSwitch und TraceSwitch bereitgestellt werden, können Sie Switch vererben. Beim Vererben dieser Klasse müssen Sie die SwitchSetting-Methode implementieren.

Beispiel

Im folgenden Beispiel wird gezeigt, wie eine neue Switch-Klasse mit vier Ebenen für die Ablaufverfolgung definiert wird, über die eine Ablaufverfolgung für eine Aufrufliste bereitgestellt werden kann. Mit dem Schalter können Sie die Anwendung instrumentieren und so jeden Aufruf und jedes Verlassen der Methode protokollieren.

Im ersten Beispiel wird die Enumeration zum Festlegen der Schalterebene erstellt.

' The following are possible values for the new switch.
Public Enum MethodTracingSwitchLevel
    Off = 0
    EnteringMethod = 1
    ExitingMethod = 2
    Both = 3
End Enum 'MethodTracingSwitchLevel
// The following are possible values for the new switch.
 public enum MethodTracingSwitchLevel {
    Off = 0,
    EnteringMethod = 1,
    ExitingMethod = 2,
    Both = 3,
 }
// The following are possible values for the new switch.
public enum class MethodTracingSwitchLevel
{
   Off = 0,
   EnteringMethod = 1,
   ExitingMethod = 2,
   Both = 3
};

// The following are possible values for the new switch.
public class MethodTracingSwitchLevel
{
    private int member;

    MethodTracingSwitchLevel()
    {
        member = 0;
    }//MethodTracingSwitchLevel

    MethodTracingSwitchLevel(int n)
    {
        member = n;
    }//MethodTracingSwitchLevel

    public int get_Member()
    {
        return member;
    }//get_Member

    public static int off = 0;
    public static int enteringMethod = 1;
    public static int exitingMethod = 2;
    public static int both = 3;
} //MethodTracingSwitchLevel

Im folgenden Beispiel wird der neue Schalter erstellt. Der Code implementiert eine Level-Eigenschaft, um den Wert des neuen Schalters festzulegen. Level ruft die geschützte SwitchSetting-Eigenschaft auf, die dem neuen Schalter den Wert zuweist. In diesem Beispiel werden außerdem zwei Accessoreigenschaften implementiert, um den zugeordneten Wert des Schalters abzurufen.

Public Class MyMethodTracingSwitch
    Inherits Switch
    Protected outExit As Boolean
    Protected outEnter As Boolean
    Protected myLevel As MethodTracingSwitchLevel
    
    
    Public Sub New(displayName As String, description As String)
        MyBase.New(displayName, description)
    End Sub 'New
    
    
    Public Property Level() As MethodTracingSwitchLevel
        Get
            Return myLevel
        End Get
        Set
            SetSwitchSetting(CInt(value))
        End Set
    End Property
    
    
    Protected Sub SetSwitchSetting(value As Integer)
        If value < 0 Then
            value = 0
        End If
        If value > 3 Then
            value = 3
        End If
        
        myLevel = CType(value, MethodTracingSwitchLevel)
        
        outEnter = False
        If value = CInt(MethodTracingSwitchLevel.EnteringMethod) Or _
            value = CInt(MethodTracingSwitchLevel.Both) Then
            
            outEnter = True
        End If
        
        outExit = False
        If value = CInt(MethodTracingSwitchLevel.ExitingMethod) Or _
            value = CInt(MethodTracingSwitchLevel.Both) Then
            
            outExit = True
        End If
    End Sub 'SetSwitchSetting
    
    
    Public ReadOnly Property OutputExit() As Boolean
        Get
            Return outExit
        End Get
    End Property
    
    
    Public ReadOnly Property OutputEnter() As Boolean
        Get
            Return outEnter
        End Get
    End Property
End Class 'MyMethodTracingSwitch
public class MyMethodTracingSwitch:Switch {
     protected bool outExit;
     protected bool outEnter;
     protected MethodTracingSwitchLevel level;
 
     public MyMethodTracingSwitch(string displayName, string description):base(displayName, description){
     }
 
     public MethodTracingSwitchLevel Level {
         get{
             return level;
         }
         set{
             SetSwitchSetting((int)value);
         }
     }
     
     protected void SetSwitchSetting(int value){
         if(value<0){
             value = 0;
         }
         if(value>3){
             value = 3;
         }
 
         level = (MethodTracingSwitchLevel)value;
 
         outEnter = false;
         if((value == (int)MethodTracingSwitchLevel.EnteringMethod) || (value == (int)MethodTracingSwitchLevel.Both)){
             outEnter = true;
         }
 
         outExit = false;
         if((value == (int)MethodTracingSwitchLevel.ExitingMethod) || (value == (int)MethodTracingSwitchLevel.Both)){
             outExit = true;
         }
     }
 
     public bool OutputExit{
         get{
             return outExit;
         }
     }
 
     public bool OutputEnter{
         get{
             return outEnter;
         }
     }
 }
public ref class MyMethodTracingSwitch: public Switch
{
protected:
   bool outExit;
   bool outEnter;
   MethodTracingSwitchLevel level;

public:
   MyMethodTracingSwitch( String^ displayName, String^ description )
      : Switch( displayName, description )
   {}


   property MethodTracingSwitchLevel Level 
   {
      MethodTracingSwitchLevel get()
      {
         return level;
      }

      void set( MethodTracingSwitchLevel value )
      {
         SetSwitchSetting( (int)value );
      }

   }

protected:
   void SetSwitchSetting( int value )
   {
      if ( value < 0 )
      {
         value = 0;
      }

      if ( value > 3 )
      {
         value = 3;
      }

      level = (MethodTracingSwitchLevel)value;
      outEnter = false;
      if ( (value == (int)MethodTracingSwitchLevel::EnteringMethod) || (value == (int)MethodTracingSwitchLevel::Both) )
      {
         outEnter = true;
      }

      outExit = false;
      if ( (value == (int)MethodTracingSwitchLevel::ExitingMethod) || (value == (int)MethodTracingSwitchLevel::Both) )
      {
         outExit = true;
      }
   }


public:

   property bool OutputExit 
   {
      bool get()
      {
         return outExit;
      }

   }

   property bool OutputEnter 
   {
      bool get()
      {
         return outEnter;
      }

   }

};

public class MyMethodTracingSwitch extends Switch
{
    protected boolean outExit;
    protected boolean outEnter;
    protected MethodTracingSwitchLevel level;

    public MyMethodTracingSwitch(String displayName, String description)
    {
      super(displayName, description);
    } //MyMethodTracingSwitch

    /** @property
     */
    public MethodTracingSwitchLevel get_Level()
    {
        return level;
    }//get_Level

    /** @property 
     */
    public void set_Level(MethodTracingSwitchLevel value)
    {
        SetSwitchSetting(value.get_Member());
    }//set_Level

    protected void SetSwitchSetting(int value)
    {
        if (value < 0) {
            value = 0;
        }
        if (value > 3) {
            value = 3;
        }

        level = new MethodTracingSwitchLevel(value);
        outEnter = false;
        if (value == (int)(MethodTracingSwitchLevel.enteringMethod) 
            || value == (int)(MethodTracingSwitchLevel.both)) {
            outEnter = true;
        }

        outExit = false;
        if (value == (int)(MethodTracingSwitchLevel.exitingMethod) 
            || value == (int)(MethodTracingSwitchLevel.both)) {
            outExit = true;
        }
    } //SetSwitchSetting

    /** @property 
     */
    public boolean get_OutputExit()
    {
        return outExit;
    }//get_OutputExit

    /** @property 
     */
    public boolean get_OutputEnter()
    {
        return outEnter;
    }//get_OutputEnter
} //MyMethodTracingSwitch

Im folgenden Beispiel wird ein neuer Schalter in Main erstellt. Es wird ein neuer Schalter erstellt und diesem ein Wert zugewiesen. Anschließend werden abhängig von den Schaltereinstellungen Debugmeldungen für das Aufrufen oder Verlassen der Methode ausgegeben.

Public Class Class1
    ' Create an instance of MyMethodTracingSwitch. 
    Private Shared mySwitch As New _
        MyMethodTracingSwitch("Methods", "Trace entering and exiting method")
    
    Public Shared Sub Main()
        ' Write a diagnostic message if the switch is set to entering.
        Debug.WriteLineIf(mySwitch.OutputEnter, "Entering Main")
        
        ' Insert code to handle processing.
        ' Write another diagnostic message if the switch is set to exiting.
        Debug.WriteLineIf(mySwitch.OutputExit, "Exiting Main")
    End Sub
End Class 'MyClass
public class MyClass {
    /* Create an instance of MyMethodTracingSwitch.*/
    static MyMethodTracingSwitch mySwitch = 
       new MyMethodTracingSwitch("Methods", "Trace entering and exiting method");
 
    public static int Main(string[] args) {
       // Write a diagnostic message if the switch is set to entering.
       Debug.WriteLineIf(mySwitch.OutputEnter, "Entering Main");
 
       // Insert code to handle processing.
 
       // Write another diagnostic message if the switch is set to exiting.
       Debug.WriteLineIf(mySwitch.OutputExit, "Exiting Main");
       return 0;
    }
 }
public ref class MyClass
{
private:

   /* Create an instance of MyMethodTracingSwitch.*/
   static MyMethodTracingSwitch^ mySwitch = gcnew MyMethodTracingSwitch( "Methods","Trace entering and exiting method" );

public:
   static int main()
   {
      
      // Write a diagnostic message if the switch is set to entering.
      Debug::WriteLineIf( mySwitch->OutputEnter, "Entering Main" );
      
      // Insert code to handle processing.
      // Write another diagnostic message if the switch is set to exiting.
      Debug::WriteLineIf( mySwitch->OutputExit, "Exiting Main" );
      return 0;
   }

};

public class MyClass
{
    /* Create an instance of MyMethodTracingSwitch.
    */
    private static MyMethodTracingSwitch mySwitch = new MyMethodTracingSwitch(
        "Methods", "Trace entering and exiting method");

    public static void main(String[] args)
    {
        // Write a diagnostic message if the switch is set to entering.
        Debug.WriteLineIf(mySwitch.get_OutputEnter(), "Entering main");
        // Insert code to handle processing.
        // Write another diagnostic message if the switch is set to exiting.
        Debug.WriteLineIf(mySwitch.get_OutputExit(), "Exiting main");
        return;
    } //main
} //MyClass

Vererbungshierarchie

System.Object
  System.Diagnostics.Switch
     System.Diagnostics.BooleanSwitch
     System.Diagnostics.SourceSwitch
     System.Diagnostics.TraceSwitch

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

Switch-Member
System.Diagnostics-Namespace
BooleanSwitch-Klasse
TraceSwitch
Debug-Klasse
Trace