次の方法で共有


Switch クラス

新しいデバッグ スイッチおよびトレース スイッチを作成するための抽象 (Visual Basic では MustInherit) 基本クラスを提供します。

この型のすべてのメンバの一覧については、Switch メンバ を参照してください。

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

MustInherit Public Class Switch
[C#]
public abstract class Switch
[C++]
public __gc __abstract class Switch
[JScript]
public abstract class Switch

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

スイッチは、外部設定を使用して、実行時にトレース出力やデバッグ出力を制御するための効率的な機構を提供します。 Switch クラスは、スイッチの既定の動作を実装します。スイッチ レベルは、実行時に変更できます。

このクラスは、 BooleanSwitch クラスおよび TraceSwitch クラスの基本クラスです。これらのスイッチで、ほとんどのデバッグおよびトレースの要件を満たすことができます。スイッチを作成する場合は、スイッチを静的 (Visual Basic では Shared) に設定する必要があります。

スイッチを使用するには、トレースまたはデバッグを有効にする必要があります。次の構文はコンパイラに固有です。C# または Visual Basic 以外のコンパイラを使用する場合は、使用するコンパイラのドキュメントを参照してください。

  • C# でデバッグを有効にするには、コードのコンパイル時に /d:DEBUG フラグをコンパイラのコマンド ラインに追加するか、 #define DEBUG をファイルの最上部に挿入します。Visual Basic では、コンパイラのコマンド ラインに /d:DEBUG=True フラグを追加します。
  • C# でトレースを有効にするには、コードのコンパイル時に /d:TRACE フラグをコンパイラのコマンド ラインに追加するか、 #define TRACE をファイルの最上部に挿入します。Visual Basic では、コンパイラのコマンド ラインに /d:TRACE=True フラグを追加します。

スイッチのレベルを設定するには、アプリケーションの名前に対応する構成ファイルを編集します。このファイルでは、スイッチの追加、その値の設定、スイッチの削除、アプリケーションで以前設定されたすべてのスイッチのクリアを実行できます。構成ファイルの書式は次の例のようになります。

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

メモ   パフォーマンス向上のため、クラスで Switch メンバを静的 (Visual Basic では Shared) にできます。

継承時の注意: トレース レベルや、 BooleanSwitch および TraceSwitch によって提供されるものとは異なるスイッチ レベルを設定するための機構が必要な場合は、 Switch から継承します。このクラスから継承するときは、 SwitchSetting メソッドを実装する必要があります。

使用例

[Visual Basic, C#, C++] コール スタックのトレースに使用できる 4 段階のトレース レベルを持つ新しい Switch クラスを定義する方法の例を次に示します。このスイッチを使用すると、メソッドが呼び出されるたび、またはメソッドから制御が戻るたびに、アプリケーションでログを作成できます。

[Visual Basic, C#, C++] 最初の例では、スイッチのレベルを設定するために使用する列挙体を作成します。

 
' The following are possible values for the new switch.
Public Enum MethodTracingSwitchLevel
    Off = 0
    EnteringMethod = 1
    ExitingMethod = 2
    Both = 3
End Enum 'MethodTracingSwitchLevel


[C#] 
// The following are possible values for the new switch.
 public enum MethodTracingSwitchLevel {
    Off = 0,
    EnteringMethod = 1,
    ExitingMethod = 2,
    Both = 3,
 }

[C++] 
// The following are possible values for the new switch.
public __value enum MethodTracingSwitchLevel {
   Off = 0,
   EnteringMethod = 1,
   ExitingMethod = 2,
   Both = 3,
};

[Visual Basic, C#, C++] 新しいスイッチを作成する例を次に示します。このコードは、新しいスイッチの値を設定する Level プロパティを実装します。 Level は、新しいスイッチに値を割り当てるプロテクト プロパティ SwitchSetting を呼び出します。また、この例では、スイッチに代入した値を取得する 2 つのアクセサ プロパティも実装します。

 
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


[C#] 
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;
         }
     }
 }

[C++] 
public __gc class MyMethodTracingSwitch:public Switch {
protected:
   bool outExit;
   bool outEnter;
   MethodTracingSwitchLevel level;

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

   __property MethodTracingSwitchLevel get_Level(){
      return level;
   }
   __property void set_Level( 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 get_OutputExit(){
      return outExit;
   }

   __property bool get_OutputEnter(){
      return outEnter;
   }

};

Main で新しいスイッチを作成する例を次に示します。この例では、新しいスイッチを作成し、値を割り当てます。その後、スイッチの設定に応じて、メソッドの呼び出しおよび終了についてのデバッグ メッセージを出力します。

 
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

[C#] 
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;
    }
 }

[C++] 
public __gc class MyClass {
   /* Create an instance of MyMethodTracingSwitch.*/
   static MyMethodTracingSwitch* mySwitch = 
      new MyMethodTracingSwitch(S"Methods", S"Trace entering and exiting method");
public:
   static int main() {
      // Write a diagnostic message if the switch is set to entering.
      Debug::WriteLineIf(mySwitch->OutputEnter, S"Entering Main");

      // Insert code to handle processing.

      // Write another diagnostic message if the switch is set to exiting.
      Debug::WriteLineIf(mySwitch->OutputExit, S"Exiting Main");
      return 0;
   }
};

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Diagnostics

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: System (System.dll 内)

参照

Switch メンバ | System.Diagnostics 名前空間 | BooleanSwitch | TraceSwitch | Debug | Trace