Aracılığıyla paylaş


System.AppContext sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

AppContext sınıfı, kitaplık yazarlarının kullanıcılar için yeni işlevselliklerden vazgeçmeleri ya da onları devre dışı bırakmaları için tekdüzen bir mekanizma sağlamasına olanak tanır. Bir geri çevirme isteğini iletmek için bileşenler arasında gevşek bir şekilde bağlanmış bir sözleşme oluşturur. Bu özellik genellikle mevcut işlevsellikte bir değişiklik yapıldığında önemlidir. Buna karşılık, yeni işlevler için zaten örtük bir kabul vardır.

Kitaplık geliştiricileri için AppContext

Kitaplıklar, uyumluluk anahtarlarını tanımlamak ve kullanıma açmak için sınıfını AppContext kullanırken, kitaplık kullanıcıları bu anahtarları kitaplık davranışını etkileyecek şekilde ayarlayabilir. Varsayılan olarak, kitaplıklar yeni işlevselliği sağlar ve yalnızca anahtar etkinleştirildiyse işlevselliği değiştirir (yani önceki işlevi sağlar). Bu, kütüphanelerin mevcut bir API için yeni davranış sağlamasına olanak tanırken, önceki davranışa bağlı olan arayanları desteklemeye devam etmelerini sağlar.

Anahtar adını tanımlayın

Kitaplığınızın tüketicilerinin davranış değişikliğini geri çevirmesine izin vermenin en yaygın yolu adlandırılmış bir anahtar tanımlamaktır. value öğesi, bir anahtarın adı ve Boolean değeri ile oluşan bir ad/değer çiftidir. Varsayılan olarak, anahtar her zaman false olarak çalışır ve bu yeni davranışı sağlar (ve yeni davranışı varsayılan olarak etkin kılar). Anahtarı true olarak ayarlamak, geçmişe yönelik davranışı sağlayan özelliği etkinleştirir. Anahtarı açıkça false olarak ayarlamak da yeni davranışı sağlar.

Kütüphane tarafından kullanıma sunulan resmi bir sözleşme oldukları için, anahtar adları için tutarlı bir biçim kullanmak yararlıdır. Aşağıdakiler iki belirgin biçimdir:

  • Anahtar.adalanı.anahtaradı
  • Anahtar. kitaplık. anahtar adı

Anahtarı tanımlayıp belgeledikten sonra, arayanlar AppContext.SetSwitch(String, Boolean) yöntemini programatik olarak çağırarak kullanabilir. .NET Framework uygulamaları, uygulama yapılandırma dosyalarına bir <AppContextSwitchOverrides> öğesi ekleyerek veya kayıt defterini kullanarak anahtarı da kullanabilir. Çağıranların AppContext yapılandırma anahtarlarını nasıl kullandığı ve değerini nasıl ayarladığı hakkında daha fazla bilgi için Kitaplık Tüketicileri için AppContext bölümüne bakın.

.NET Framework'te, ortak dil çalışma zamanı bir uygulamayı çalıştırdığında, kayıt defterinin uyumluluk ayarlarını otomatik olarak okur ve uygulamanın AppContext örneğini doldurmak için uygulama yapılandırma dosyasını yükler. AppContext örneği, çağıran kişi veya çalışma zamanı tarafından ya program aracılığıyla ya da doğrudan doldurulmuş olduğundan, .NET Framework uygulamalarının SetSwitch örneğini yapılandırmak için AppContext yöntemini çağırmak gibi herhangi bir eylemde bulunmalarına gerek yoktur.

Ayarı denetleyin

Bir tüketicinin anahtarın değerini beyan edip etmediğini denetleyebilir ve AppContext.TryGetSwitch yöntemini çağırarak buna uygun şekilde hareket edebilirsiniz. Yöntem, true bağımsız değişkeni bulunduğunda switchName döndürür ve isEnabled bağımsız değişkeni anahtarın değerini belirtir. Aksi takdirde false döndürür.

Örnek

Aşağıdaki örnekte, müşterinin bir kitaplık yönteminin AppContext özgün davranışını seçmesine izin vermek için sınıfının kullanımı gösterilmektedir. Aşağıda, adlı StringLibrarykitaplığın 1.0 sürümü verilmiştir. Daha büyük bir dize içindeki bir SubstringStartsAt alt dizenin başlangıç dizinini belirlemek için sıralı bir karşılaştırma gerçekleştiren bir yöntem tanımlar.

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.0.0")]

public static class StringLibrary1
{
    public static int SubstringStartsAt(string fullString, string substr)
    {
        return fullString.IndexOf(substr, StringComparison.Ordinal);
    }
}
open System
open System.Reflection

[<assembly: AssemblyVersion("1.0.0.0")>]
do ()

module StringLibrary =
    let substringStartsAt (fullString: string) (substr: string) =
        fullString.IndexOf(substr, StringComparison.Ordinal)
Imports System.Reflection

<Assembly: AssemblyVersion("1.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Return fullString.IndexOf(substr, StringComparison.Ordinal)
   End Function
End Class

Aşağıdaki örnek daha sonra "Arkeolog" içindeki "archæ" alt dizesinin başlangıç dizinini bulmak için kitaplığını kullanır. yöntemi sıralı bir karşılaştırma gerçekleştirdiğinden, alt dize bulunamıyor.

using System;

public class Example1
{
    public static void Main()
    {
        string value = "The archaeologist";
        string substring = "archæ";
        int position = StringLibrary1.SubstringStartsAt(value, substring);
        if (position >= 0)
            Console.WriteLine($"'{substring}' found in '{value}' starting at position {position}");
        else
            Console.WriteLine($"'{substring}' not found in '{value}'");
    }
}
// The example displays the following output:
//       'archæ' not found in 'The archaeologist'
let value = "The archaeologist"
let substring = "archæ"

let position =
    StringLibrary.substringStartsAt value substring

if position >= 0 then
    printfn $"'{substring}' found in '{value}' starting at position {position}"
else
    printfn $"'{substring}' not found in '{value}'"

// The example displays the following output:
//       'archæ' not found in 'The archaeologist'
Public Module Example4
    Public Sub Main()
        Dim value As String = "The archaeologist"
        Dim substring As String = "archæ"
        Dim position As Integer = StringLibrary.SubstringStartsAt(value, substring)
        If position >= 0 Then
            Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position)
        Else
            Console.WriteLine("'{0}' not found in '{1}'", substring, value)
        End If
    End Sub
End Module
' The example displays the following output:
'       'archæ' not found in 'The archaeologist'

Kitaplığın 2.0 sürümü, ancak, SubstringStartsAt yöntemini kültüre duyarlı karşılaştırmayı kullanacak şekilde değiştirir.

using System;
using System.Reflection;

[assembly: AssemblyVersion("2.0.0.0")]

public static class StringLibrary2
{
    public static int SubstringStartsAt(string fullString, string substr)
    {
        return fullString.IndexOf(substr, StringComparison.CurrentCulture);
    }
}
open System
open System.Reflection

[<assembly: AssemblyVersion("2.0.0.0")>]
do ()

module StringLibrary =
    let substringStartsAt (fullString: string) (substr: string) =
        fullString.IndexOf(substr, StringComparison.CurrentCulture)
Imports System.Reflection

<Assembly: AssemblyVersion("2.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Return fullString.IndexOf(substr, StringComparison.CurrentCulture)
   End Function
End Class

Uygulama, kitaplığın yeni sürümüne karşı çalışacak şekilde yeniden derlendiğinde, artık "archæ" alt dizesinin "Arkeolog" içindeki dizin 4'te bulunduğunu bildiriyor.

using System;

public class Example2
{
    public static void Main()
    {
        string value = "The archaeologist";
        string substring = "archæ";
        int position = StringLibrary2.SubstringStartsAt(value, substring);
        if (position >= 0)
            Console.WriteLine($"'{substring}' found in '{value}' starting at position {position}");
        else
            Console.WriteLine($"'{substring}' not found in '{value}'");
    }
}
// The example displays the following output:
//       'archæ' found in 'The archaeologist' starting at position 4
let value = "The archaeologist"
let substring = "archæ"

let position =
    StringLibrary.substringStartsAt value substring

if position >= 0 then
    printfn $"'{substring}' found in '{value}' starting at position {position}"
else
    printfn $"'{substring}' not found in '{value}'"

// The example displays the following output:
//       'archæ' found in 'The archaeologist' starting at position 4
Public Module Example6
    Public Sub Main()
        Dim value As String = "The archaeologist"
        Dim substring As String = "archæ"
        Dim position As Integer = StringLibrary.SubstringStartsAt(value, substring)
        If position >= 0 Then
            Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position)
        Else
            Console.WriteLine("'{0}' not found in '{1}'", substring, value)
        End If
    End Sub
End Module
' The example displays the following output:
'       'archæ' found in 'The archaeologist' starting at position 4

Bu değişikliğin, bir anahtar tanımlayarak özgün davranışa bağlı olan uygulamaları bozması önlenebilir. Bu durumda, anahtar StringLibrary.DoNotUseCultureSensitiveComparison olarak adlandırılır. Varsayılan değeri olan false, kitaplığın 2.0 sürümündeki kültüre duyarlı karşılaştırmayı gerçekleştirmesi gerektiğini gösterir. true, kütüphanenin 1.0 sürümü için sıralı karşılaştırmasını gerçekleştirmesi gerektiğini gösterir. Önceki kodun küçük bir değişikliği, kitaplık tüketicisinin yöntemin gerçekleştirdiği karşılaştırma türünü belirlemek için anahtarı ayarlamasına olanak tanır.

using System;
using System.Reflection;

[assembly: AssemblyVersion("2.0.0.0")]

public static class StringLibrary
{
   public static int SubstringStartsAt(string fullString, string substr)
   {
      bool flag;
      if (AppContext.TryGetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison", out flag) && flag == true)
         return fullString.IndexOf(substr, StringComparison.Ordinal);
      else
         return fullString.IndexOf(substr, StringComparison.CurrentCulture);
   }
}
open System
open System.Reflection

[<assembly: AssemblyVersion("2.0.0.0")>]
do ()

AppContext.SetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison",true)

module StringLibrary =
    let substringStartsAt (fullString: string) (substr: string) =
        match AppContext.TryGetSwitch "StringLibrary.DoNotUseCultureSensitiveComparison" with 
        | true, true -> fullString.IndexOf(substr, StringComparison.Ordinal)
        | _ -> fullString.IndexOf(substr, StringComparison.CurrentCulture)
Imports System.Reflection

<Assembly: AssemblyVersion("2.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Dim flag As Boolean
      If AppContext.TryGetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison", flag) AndAlso flag = True Then
         Return fullString.IndexOf(substr, StringComparison.Ordinal)
      Else
         Return fullString.IndexOf(substr, StringComparison.CurrentCulture)
      End If   
   End Function
End Class

Bir .NET Framework uygulaması, sürüm 1.0 davranışını geri yüklemek için aşağıdaki yapılandırma dosyasını kullanabilir.

<configuration>
   <runtime>
      <AppContextSwitchOverrides value="StringLibrary.DoNotUseCultureSensitiveComparison=true" />
   </runtime>
</configuration>

Uygulama mevcut yapılandırma dosyasıyla çalıştırıldığında aşağıdaki çıkışı üretir:

'archæ' not found in 'The archaeologist'

Kitaplık tüketicileri için AppContext

Bir kitaplık tüketicisiyseniz, AppContext sınıfı, yeni işlevsellik için bir kitaplığın veya kitaplık yönteminin vazgeçme mekanizmasından yararlanmanızı sağlar. Çağırdığınız sınıf kitaplığının tek tek yöntemleri, yeni bir davranışı etkinleştiren veya devre dışı bırakan belirli anahtarları tanımlar. Anahtarın değeri bir Boole veri türüdür. Varsayılan falsedeğer olan ise, yeni davranış etkinleştirilir; ise true, yeni davranış devre dışı bırakılır ve üye daha önce olduğu gibi davranır.

Kodu içinde AppContext.SetSwitch(String, Boolean) yöntemini çağırarak bir anahtarın değerini ayarlayabilirsiniz. switchName bağımsız değişkeni anahtar adını, isEnabled özelliği ise anahtarın değerini belirler. AppContext Statik bir sınıf olduğundan, uygulama başına etki alanı temelinde kullanılabilir. "AppContext.SetSwitch(String, Boolean) çağırma" uygulama "kapsamına" sahiptir; yani yalnızca uygulamayı etkiler.

.NET Framework uygulamalarının bir anahtarın değerini ayarlamak için ek yolları vardır:

  • app.config dosyasının <AppContextSwitchOverrides> bölümüne bir <runtime> öğe ekleyerek. Anahtarın, tek bir özniteliği value olan ve bu özniteliğin değeri anahtar adını ve değerini içeren bir anahtar/değer çiftini temsil eden bir dizedir.

    Birden çok anahtar tanımlamak için, öğenin <AppContextSwitchOverrides> özniteliğindeki her anahtarın value anahtar/değer çiftini noktalı virgülle ayırın. Bu durumda, <AppContextSwitchOverrides> öğesi aşağıdaki biçime sahiptir:

    <AppContextSwitchOverrides value="switchName1=value1;switchName2=value2" />
    

    <AppContextSwitchOverrides> bir yapılandırma ayarı tanımlamak için öğesinin kullanılması uygulama kapsamına sahiptir; yani yalnızca uygulamayı etkiler.

    Uyarı

    .NET Framework tarafından tanımlanan anahtarlar hakkında bilgi için bkz <AppContextSwitchOverrides> . öğesi.

  • Kayıt defterine bir girdi ekleyerek. HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext alt anahtarına yeni bir dize değeri ekleyin. Girişin adını anahtarın adı olarak ayarlayın. Değerini şu seçeneklerden birine ayarlayın: True, true, Falseveya false. Çalışma zamanı başka bir değerle karşılaşırsa, değiştiriciyi görmezden gelir.

    64 bit işletim sisteminde, aynı girdiyi HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext alt anahtarına da eklemeniz gerekir.

    Kayıt defteri kullanılarak bir AppContext anahtar tanımlamak makine kapsamındadır; yani, bu makinede çalışan her uygulamayı etkiler.

ASP.NET ve ASP.NET Core uygulamaları için, web.config dosyasının <appSettings> bölümüne bir <Add> öğesi ekleyerek bir anahtar ayarlarsınız. Örneğin:

<appSettings>
   <add key="AppContext.SetSwitch:switchName1" value="switchValue1" />
   <add key="AppContext.SetSwitch:switchName2" value="switchValue2" />
</appSettings>

Aynı anahtarı birden çok şekilde ayarlarsanız, diğer ayarları geçersiz kılan ayarı belirlemek için öncelik sırası:

  1. Programatik ayar.
  2. app.config dosyasındaki (.NET Framework uygulamaları için) veya web.config dosyasındaki ayar (ASP.NET Core uygulamaları için).
  3. Kayıt defteri ayarı (yalnızca .NET Framework uygulamaları için).

Ayrıca bkz.