Поделиться через


Switch Класс

Определение

Предоставляет абстрактный базовый класс для создания новых переключателей отладки и трассировки.

public ref class Switch abstract
public abstract class Switch
type Switch = class
Public MustInherit Class Switch
Наследование
Switch
Производный

Примеры

В следующем примере показано, как определить новый Switch класс с четырьмя уровнями трассировки, которые можно использовать для трассировки стека вызовов. Параметр можно использовать для инструментирования приложения для ведения журнала при каждом входе или выходе из метода.

В первом примере создается перечисление, используемое для задания уровня переключателя.

// 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 enum MethodTracingSwitchLevel
{
    Off = 0,
    EnteringMethod = 1,
    ExitingMethod = 2,
    Both = 3,
}
' The following are possible values for the new switch.
Public Enum MethodTracingSwitchLevel
    Off = 0
    EnteringMethod = 1
    ExitingMethod = 2
    Both = 3
End Enum 'MethodTracingSwitchLevel

В следующем примере создается новый параметр . Код реализует Level свойство для задания значения нового параметра. Level вызывает защищенное свойство SwitchSetting , которое присваивает значение новому коммутатору. В этом примере также реализуются два свойства оценчика для получения назначенного значения переключателя.

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 : 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 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


    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


    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

В следующем примере создается новый параметр в Main. Он создает новый параметр и присваивает ему значение. Затем, в зависимости от параметров переключателя, он выводит сообщения отладки для ввода метода и выхода из него.

public ref class Class1
{
private:

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

public:
    static void main()
    {
        // Add the console listener to see trace messages as console output
        Trace::Listeners->Add(gcnew ConsoleTraceListener(true));
        Debug::AutoFlush = true;

        // Set the switch level to both enter and exit
        mySwitch->Level = MethodTracingSwitchLevel::Both;

        // Write a diagnostic message if the switch is set to entering.
        Debug::WriteLineIf(mySwitch->OutputEnter, "Entering Main");

        // Insert code to handle processing here...

        // Write another diagnostic message if the switch is set to exiting.
        Debug::WriteLineIf(mySwitch->OutputExit, "Exiting Main");
    }
};
public class Class1
{
    /* Create an instance of MyMethodTracingSwitch.*/
    static MyMethodTracingSwitch mySwitch =
        new MyMethodTracingSwitch("Methods", "Trace entering and exiting method");

    public static void Main()
    {
        // Add the console listener to see trace messages as console output
        Trace.Listeners.Add(new ConsoleTraceListener(true));
        Debug.AutoFlush = true;

        // Set the switch level to both enter and exit
        mySwitch.Level = MethodTracingSwitchLevel.Both;

        // Write a diagnostic message if the switch is set to entering.
        Debug.WriteLineIf(mySwitch.OutputEnter, "Entering Main");

        // Insert code to handle processing here...

        // Write another diagnostic message if the switch is set to exiting.
        Debug.WriteLineIf(mySwitch.OutputExit, "Exiting 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()
        ' Add the console listener to see trace messages as console output
        Trace.Listeners.Add(New ConsoleTraceListener(True))
        Debug.AutoFlush = True

        ' Set the switch level to both enter and exit
        mySwitch.Level = MethodTracingSwitchLevel.Both

        ' Write a diagnostic message if the switch is set to entering.
        Debug.WriteLineIf(mySwitch.OutputEnter, "Entering Main")

        ' Insert code to handle processing here...

        ' Write another diagnostic message if the switch is set to exiting.
        Debug.WriteLineIf(mySwitch.OutputExit, "Exiting Main")
    End Sub
End Class

Комментарии

Коммутатор предоставляет эффективный механизм для управления трассировкой и отладкой выходных данных во время выполнения с помощью внешних параметров. Класс Switch реализует поведение по умолчанию для коммутаторов, что позволяет изменять уровень коммутатора во время выполнения.

Этот класс является базовым классом BooleanSwitchдля классов , SourceSwitchи TraceSwitch . Эти параметры соответствуют большинству потребностей отладки и трассировки. Дополнительные сведения о переключателях трассировки см. в разделе Переключатели трассировки.

Для использования переключателя необходимо включить трассировку или отладку. Следующий синтаксис зависит от компилятора. Если вы используете компиляторы, отличные от C# или Visual Basic, обратитесь к документации по компилятору.

  • Чтобы включить отладку /d:DEBUG в C#, добавьте флаг в командную строку компилятора при компиляции кода или добавьте #define DEBUG в начало файла. В Visual Basic добавьте /d:DEBUG=True флаг в командную строку компилятора.

  • Чтобы включить трассировку с помощью C#, добавьте /d:TRACE флаг в командную строку компилятора при компиляции кода или добавьте #define TRACE в начало файла. В Visual Basic добавьте /d:TRACE=True флаг в командную строку компилятора.

Чтобы задать уровень переключателя в приложении платформа .NET Framework, измените файл конфигурации, соответствующий имени приложения. В этом файле можно добавить параметр и задать его значение, удалить переключатель или очистить все параметры, ранее заданные приложением. Файл конфигурации должен быть отформатирован, как показано в следующем примере:

<configuration>  
  <system.diagnostics>  
    <switches>  
      <add name="mySwitch" value="true" />  
    </switches>  
  </system.diagnostics>  
</configuration>  

В этом примере раздела конфигурации определяется со свойством BooleanSwitchDisplayName , для свойства задано значение mySwitch , а Enabled для параметра — trueзначение . В приложении можно использовать настроенное значение переключателя, создав BooleanSwitch с тем же именем, как показано в следующем примере кода.

private:
    static BooleanSwitch^ boolSwitch = gcnew BooleanSwitch("mySwitch",
        "Switch in config file");

public:
    static void Main( )
    {
        //...
        Console::WriteLine("Boolean switch {0} configured as {1}",
            boolSwitch->DisplayName, ((Boolean^)boolSwitch->Enabled)->ToString());
        if (boolSwitch->Enabled)
        {
            //...
        }
    }
private static BooleanSwitch boolSwitch = new BooleanSwitch("mySwitch",
    "Switch in config file");

public static void Main()
{
    //...
    Console.WriteLine("Boolean switch {0} configured as {1}",
        boolSwitch.DisplayName, boolSwitch.Enabled.ToString());
    if (boolSwitch.Enabled)
    {
        //...
    }
}

Примечания для тех, кто реализует этот метод

Если требуются уровни трассировки или механизмы для задания уровней коммутатора, отличных от уровней, предоставляемых BooleanSwitch, SourceSwitch и TraceSwitch, можно наследовать от Switch. При наследовании от этого класса необходимо реализовать SwitchSetting метод .

Конструкторы

Switch(String, String)

Инициализирует новый экземпляр класса Switch.

Switch(String, String, String)

Инициализирует новый экземпляр класса Switch, указывая отображаемое имя, описание и значение по умолчанию переключателя.

Свойства

Attributes

Получает настраиваемые атрибуты переключателя, определенные в файле конфигурации приложения.

DefaultValue

Возвращает значение по умолчанию, назначенное в конструкторе .

Description

Получает описание переключателя.

DisplayName

Получает имя, идентифицирующее переключатель.

SwitchSetting

Получает или задает текущее положение данного переключателя.

Value

Получает или задает значение переключателя.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetSupportedAttributes()

Возвращает настраиваемые атрибуты, поддерживаемые переключателем.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
OnSwitchSettingChanged()

Вызывается при изменении свойства SwitchSetting.

OnValueChanged()

Вызывается при изменении свойства Value.

Refresh()

Обновляет данные конфигурации трассировки.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

События

Initializing

Происходит, когда необходимо инициализировать Switch .

Применяется к

См. также раздел