Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.
Az AppContext osztály lehetővé teszi a könyvtárírók számára, hogy egységes leiratkozási mechanizmust biztosítsanak az új funkciókhoz a felhasználók számára. Lazán összekapcsolt szerződést hoz létre az összetevők között a leiratkozási kérelem közlése érdekében. Ez a képesség általában fontos a meglévő funkciók módosításakor. Ezzel szemben már implicit módon is engedélyezve van az új funkciók használata.
AppContext könyvtárfejlesztőknek
A kódtárak az AppContext osztály használatával definiálják és teszik elérhetővé a kompatibilitási kapcsolókat, míg a tár felhasználói beállíthatják, hogy ezek a kapcsolók befolyásolják a tár működését. Alapértelmezés szerint a kódtárak biztosítják az új funkciókat, és csak akkor módosítják (vagyis az előző funkciót) ha a kapcsoló be van állítva. Ez lehetővé teszi, hogy a kódtárak új viselkedést biztosítsanak egy meglévő API-hoz, miközben továbbra is támogatják az előző viselkedéstől függő hívókat.
A kapcsoló nevének megadása
A leggyakoribb módja annak, hogy a könyvtár felhasználói kikapcsolják a viselkedés megváltoztatását, ha elnevezett kapcsolót definiálnak. Az value elem egy név/érték pár, amely egy kapcsoló nevéből és értékéből Boolean áll. Alapértelmezés szerint a kapcsoló mindig implicit módon falseműködik, ami biztosítja az új viselkedést (és alapértelmezés szerint az új viselkedést is bekapcsolja). A kapcsoló true beállítása engedélyezi, ami a korábbi viselkedést biztosítja. Az új viselkedést az is biztosítja, ha explicit módon beállítja a kapcsolót false-ra.
Érdemes konzisztens formátumot használni a kapcsolónevekhez, mivel ezek egy kódtár által közzétett hivatalos szerződés. A következő két nyilvánvaló formátum:
- Kapcsoló.névtér.kapcsolónév
- Kapcsoló.könyvtár.kapcsolónév
A kapcsoló definiálása és dokumentálása után a hívók programozott módon hívhatják meg a AppContext.SetSwitch(String, Boolean) metódust. A .NET-keretrendszer-alkalmazások úgy is használhatják a kapcsolót, hogy hozzáadnak egy <AppContextSwitchOverrides> elemet az alkalmazáskonfigurációs fájljukhoz vagy a beállításjegyzék használatával. A hívók által használt és a konfigurációs kapcsolók értékének beállításával AppContext kapcsolatos további információkért tekintse meg az AppContext for library consumers szakaszt.
A .NET-keretrendszerben, amikor a közös nyelvi futtatókörnyezet futtat egy alkalmazást, automatikusan felolvassa a beállításjegyzék kompatibilitási beállításait, és betölti az alkalmazás konfigurációs fájlját az alkalmazás példányának feltöltéséhez AppContext . Mivel a AppContext példányt programozott módon tölti ki a hívó vagy a futtatókörnyezet, a .NET-keretrendszerbeli alkalmazásoknak nem kell semmilyen műveletet elvégezniük, például meghívni a metódust SetSwitch a AppContext példány konfigurálásához.
A beállítás ellenőrzése
A metódus meghívásával AppContext.TryGetSwitch ellenőrizheti, hogy a fogyasztó deklarálta-e a kapcsoló értékét, és megfelelően jár-e el. A metódus akkor ad vissza értéket true , ha az switchName argumentum megtalálható, és az isEnabled argumentuma a kapcsoló értékét jelzi. Ellenkező esetben a metódus ad vissza false.
Példa
Az alábbi példa az osztály használatát AppContext mutatja be, amely lehetővé teszi az ügyfél számára a kódtár-metódus eredeti viselkedésének kiválasztását. A következő a(z) StringLibrary nevű könyvtár 1.0-s verziója. Meghatároz egy metódust SubstringStartsAt , amely egy nagyobb sztringen belüli részsztring kezdő indexének meghatározásához végez sorszám-összehasonlítást.
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
Az alábbi példa ezt követően a könyvtárat használja, hogy megtalálja a "archæ" szóközi rész kezdő indexét a "The archaeologist" kifejezésben. Mivel a módszer sorrendi összehasonlítást végez, a részsztring nem található meg.
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'
A kódtár 2.0-s verziója azonban megváltoztatja a metódust a SubstringStartsAt kultúraérzékeny összehasonlítás használatára.
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
Amikor az alkalmazást újrafordítjuk, hogy az új könyvtárverzióval működjön, most azt jelzi, hogy az "archæ" részlet a 4. indexen található a "The archaeologist" (A régész) szövegben.
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
Ez a módosítás megakadályozhatja, hogy egy kapcsoló definiálásával feltörje az eredeti viselkedéstől függő alkalmazásokat. Ebben az esetben a kapcsoló neve StringLibrary.DoNotUseCultureSensitiveComparison. Az alapértelmezett érték azt jelzi, falsehogy a tárnak végre kell hajtania a 2.0-s verzió kulturális szempontból érzékeny összehasonlítását.
true azt jelzi, hogy a könyvtárnak végre kell hajtania az 1.0-s verziójú sorszám-összehasonlítást. Az előző kód enyhe módosítása lehetővé teszi, hogy a kódtár-fogyasztó beállítsa a kapcsolót, hogy meghatározza a metódus által végrehajtott összehasonlítás módját.
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
A .NET-keretrendszer-alkalmazások ezután az alábbi konfigurációs fájllal visszaállíthatják az 1.0-s verzió viselkedését.
<configuration>
<runtime>
<AppContextSwitchOverrides value="StringLibrary.DoNotUseCultureSensitiveComparison=true" />
</runtime>
</configuration>
Ha az alkalmazás a jelen lévő konfigurációs fájllal fut, a következő kimenetet hozza létre:
'archæ' not found in 'The archaeologist'
AppContext könyvtárfelhasználóknak
Ha Ön a könyvtár felhasználója, az AppContext osztály lehetővé teszi, hogy kihasználja a könyvtár vagy a könyvtár metódusának új funkcióihoz való kilépési mechanizmusát. A meghívni kívánt osztálytár egyes metódusai meghatározott kapcsolókat határoznak meg, amelyek új viselkedést engedélyeznek vagy tiltanak le. A kapcsoló értéke egy logikai érték. Ha ez falseaz alapértelmezett érték, akkor az új viselkedés engedélyezve van; ha igen true, az új viselkedés le van tiltva, és a tag ugyanúgy viselkedik, mint korábban.
A kapcsoló értékét úgy állíthatja be, hogy meghívja a AppContext.SetSwitch(String, Boolean) metódust a kódban. Az switchName argumentum határozza meg a kapcsoló nevét, a isEnabled tulajdonság pedig a kapcsoló értékét. Mivel AppContext statikus osztályról van szó, alkalmazásonkénti tartományonként érhető el. A AppContext.SetSwitch(String, Boolean) hívásának alkalmazási hatóköre van, vagyis csak az alkalmazásra van hatással.
A .NET-keretrendszer alkalmazásainak további módjai vannak a kapcsoló értékének beállítására:
Ha hozzáad egy
<AppContextSwitchOverrides>elemet a<runtime>app.config fájl szakaszához. A kapcsoló egyetlen attribútummal rendelkezik,valueamelynek értéke egy olyan sztring, amely a kapcsoló nevét és értékét egyaránt tartalmazó kulcs-érték párokat jelöli.Több kapcsoló definiálásához különítse el az elem
<AppContextSwitchOverrides>attribútumában lévővaluekulcs-érték párokat pontosvesszővel. Ebben az esetben az<AppContextSwitchOverrides>elem formátuma a következő:<AppContextSwitchOverrides value="switchName1=value1;switchName2=value2" />A konfigurációs beállítás definiálásához használt
<AppContextSwitchOverrides>elem alkalmazáshatókörrel rendelkezik, vagyis csak az alkalmazást érinti.Megjegyzés
A .NET-keretrendszer által definiált kapcsolókkal kapcsolatos információkért lásd az
<AppContextSwitchOverrides>elemet.A beállításjegyzékhez egy bejegyzés hozzáadásával. Adjon hozzá egy új szöveges értéket a HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext alkulcshoz. Állítsa a bejegyzés nevét úgy, hogy megegyezzen a kapcsoló nevével. Állítsa be az értékét az alábbi lehetőségek egyikére:
True,true,Falsevagyfalse. Ha a futtatókörnyezet bármilyen más értékkel találkozik, figyelmen kívül hagyja a kapcsolót.Egy 64 bites operációs rendszeren ugyanazt a bejegyzést is hozzá kell adnia a HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext alkulcshoz.
A kapcsolók beállításjegyzékben való definiálása AppContext gépi hatókörrel rendelkezik, vagyis a gépen futó összes alkalmazást érinti.
Az ASP.NET és ASP.NET Core-alkalmazások esetében úgy állíthat be egy kapcsolót, hogy hozzáad egy <Add> elemet a <appSettings> web.config fájl szakaszához. Például:
<appSettings>
<add key="AppContext.SetSwitch:switchName1" value="switchValue1" />
<add key="AppContext.SetSwitch:switchName2" value="switchValue2" />
</appSettings>
Ha ugyanazt a kapcsolót több módon is beállítja, a többi beállítás felülbírálásának sorrendje a következő:
- A programszerű beállítás.
- A beállítás a app.config fájlban (.NET-keretrendszer-alkalmazások esetén) vagy a web.config fájlban (ASP.NET Core-alkalmazások esetén).
- A beállításjegyzék beállítása (csak .NET-keretrendszer-alkalmazások esetén).