Aracılığıyla paylaş


System.AppContext sınıfı

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

sınıfı, AppContext kitaplık yazarlarının kullanıcıları için yeni işlevler için tekdüzen bir geri çevirme mekanizması 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 katılım 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 ayarlandıysa bunu değiştirir (yani önceki işlevi sağlar). Bu, kitaplıkların var olan bir API için yeni davranış sağlamasına olanak tanırken, önceki davranışa bağımlı arayanları desteklemeye devam eder.

Anahtar adını tanımlama

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. Öğesi value , bir anahtarın adından ve değerinden oluşan bir ad/değer çiftidir Boolean . Varsayılan olarak, anahtar her zaman örtük olarak falseolur ve bu da yeni davranışı sağlar (ve yeni davranışı varsayılan olarak kabul eder). anahtarı olarak true ayarlamak, eski davranışı sağlayan ayarı etkinleştirir. Anahtarı açıkça olarak olarak false ayarlamak da yeni davranışı sağlar.

Kitaplık tarafından kullanıma sunulan resmi bir sözleşme olduklarından, anahtar adları için tutarlı bir biçim kullanmak yararlı olur. Aşağıdakiler iki belirgin biçimdir:

  • Değiştir'i seçin.ad alanı.switchname
  • Değiştir'i seçin.kitaplığını seçin.switchname

Anahtarı tanımlayıp belgeledikten sonra, çağıranlar yöntemi program aracılığıyla çağırarak AppContext.SetSwitch(String, Boolean) kullanabilir. .NET Framework uygulamaları, uygulama yapılandırma dosyalarına appContextSwitchOverrides ><öğesi ekleyerek veya kayıt defterini kullanarak anahtarı da kullanabilir. Çağıranların yapılandırma anahtarlarını kullanma ve değerini ayarlama AppContext 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 örneğini doldurmak AppContext için uygulama yapılandırma dosyasını yükler. AppContext Örnek çağıran veya çalışma zamanı tarafından program aracılığıyla dolduruldığından, .NET Framework uygulamalarının örneği yapılandırmak için yöntemini çağırmak SetSwitch gibi herhangi bir eylemde bulunmaları AppContext gerekmez.

Ayarı denetleyin

Bir tüketicinin anahtarın değerini bildirip bildirmediğini denetleyebilirsiniz ve yöntemini çağırarak AppContext.TryGetSwitch uygun şekilde hareket edebilirsiniz. yöntemi, bağımsız değişken bulunursa switchName döndürür true ve isEnabled bağımsız değişkeni anahtarın değerini gösterir. Aksi takdirde yöntemi döndürür false.

Ö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("'{0}' found in '{1}' starting at position {2}",
                           substring, value, position);
        else
            Console.WriteLine("'{0}' not found in '{1}'", substring, 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'

Ancak kitaplığın 2.0 sürümü, kültüre duyarlı karşılaştırmayı kullanmak için yöntemini değiştirir SubstringStartsAt .

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("'{0}' found in '{1}' starting at position {2}",
                           substring, value, position);
        else
            Console.WriteLine("'{0}' not found in '{1}'", substring, 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 olarak adlandırılır StringLibrary.DoNotUseCultureSensitiveComparison. Varsayılan değeri olan false, kitaplığın sürüm 2.0 kültüre duyarlı karşılaştırması gerçekleştirmesi gerektiğini gösterir. true , kitaplığın sürüm 1.0 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ığın tüketicisiyseniz, sınıfı yeni AppContext işlevler için bir kitaplık veya kitaplık yönteminin geri çevirme 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 boole değeridir. 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.

Kodunuzda yöntemini çağırarak anahtarın AppContext.SetSwitch(String, Boolean) değerini ayarlayabilirsiniz. switchName bağımsız değişkeni anahtar adını, özelliği ise isEnabled anahtarın değerini tanımlar. AppContext Statik bir sınıf olduğundan, uygulama başına etki alanı temelinde kullanılabilir. çağrısı uygulama AppContext.SetSwitch(String, Boolean) 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 <çalışma zamanı> bölümüne bir <AppContextSwitchOverrides> öğe ekleyerek. Anahtarın, valuedeğeri anahtar adını ve değerini içeren bir anahtar/değer çiftini temsil eden bir dize olan tek bir özniteliği vardır.

    Birden çok anahtar tanımlamak için AppContextSwitchOverrides> öğesinin value özniteliğindeki her anahtarın <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.

    Not

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

  • Kayıt defterine bir girdi ekleyerek. HKLM\SOFTWARE\Microsoft\ öğesine yeni bir dize değeri ekleyin. NETFramework\AppContext alt anahtarı. Girdinin adını anahtarın adına 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, anahtarı yoksayar.

    64 bit işletim sisteminde, aynı girdiyi HKLM\SOFTWARE\Wow6432Node\Microsoft\ öğesine de eklemeniz gerekir. NETFramework\AppContext alt anahtarı.

    Anahtar tanımlamak için kayıt defterinin kullanılması AppContext makine kapsamına sahiptir; yani makinede çalışan her uygulamayı etkiler.

ASP.NET ve ASP.NET Core uygulamaları için, web.config dosyasının uygulama Ayarlar> bölümüne öğe ekle'yi> 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. Programlı ayar.
  2. app.config dosyasındaki (.NET Framework uygulamaları için) veya web.config dosyasındaki (ASP.NET Core uygulamaları için) ayar.
  3. Kayıt defteri ayarı (yalnızca .NET Framework uygulamaları için).

Ayrıca bkz.