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 false
olur 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ı StringLibrary
kitaplığı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 false
değ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,value
değ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
,False
veyafalse
. Ç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ı:
- Programlı ayar.
- app.config dosyasındaki (.NET Framework uygulamaları için) veya web.config dosyasındaki (ASP.NET Core uygulamaları için) ayar.
- Kayıt defteri ayarı (yalnızca .NET Framework uygulamaları için).