AppContext Sınıf

Tanım

Bir uygulamanın bağlamı hakkındaki verileri ayarlamak ve almak için üyeler sağlar.

public ref class AppContext abstract sealed
public static class AppContext
type AppContext = class
Public Class AppContext
Devralma
AppContext

Açıklamalar

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.

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.

Example

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

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.

ASP.NET Core uygulamalarda, web.config dosyasının <Add> bölümüne bir <appSettings> öğ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. web.config dosyasındaki ayar (ASP.NET Core uygulamalar için).

Özellikler

Name Description
BaseDirectory

Derleme çözümleyicisinin derlemeleri araştırmak için kullandığı temel dizinin dosya yolunu alır.

TargetFrameworkName

Geçerli uygulama tarafından hedeflenen çerçeve sürümünün adını alır.

Yöntemler

Name Description
GetData(String)

Geçerli uygulama etki alanına atanan adlandırılmış veri öğesinin değerini döndürür.

SetData(String, Object)

Geçerli uygulama etki alanına atanan adlandırılmış veri öğesinin değerini ayarlar.

SetSwitch(String, Boolean)

Anahtarın değerini ayarlar.

TryGetSwitch(String, Boolean)

Anahtarın değerini almaya çalışır.

Şunlara uygulanır