Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.
Den invarianta kulturen är kulturokänslig; det är associerat med det engelska språket men inte med något land/region. Du anger den invarianta kulturen efter namn med hjälp av en tom sträng ("") i anropet till en CultureInfo instansieringsmetod. Den här egenskapen, CultureInfo.InvariantCulture, hämtar också en instans av den invarianta kulturen. Den kan användas i nästan vilken metod som helst i namnområdet System.Globalization som kräver en kultur. Objekten som returneras av egenskaper som CompareInfo, DateTimeFormatoch NumberFormat återspeglar även strängjämförelse- och formateringskonventionerna för den invarianta kulturen.
Till skillnad från kulturkänsliga data, som kan ändras av användaranpassning eller uppdateringar av .NET Framework eller operativsystemet, är invarianta kulturdata stabila över tid och över installerade kulturer och kan inte anpassas av användare. Detta gör den invarianta kulturen särskilt användbar för åtgärder som kräver kulturoberoende resultat, till exempel formatering och parsningsåtgärder som bevarar formaterade data, eller sorterings- och sorteringsåtgärder som kräver att data visas i fast ordning oavsett kultur.
Strängoperationer
Du kan använda den invarianta kulturen för kulturkänsliga strängåtgärder som inte påverkas av den aktuella kulturens konventioner och som är konsekventa mellan kulturer. Du kanske till exempel vill att sorterade data ska visas i en fast ordning eller tillämpa en standarduppsättning med höljekonventioner på strängar oavsett aktuell kultur. För att göra detta skickar InvariantCulture du objektet till en metod som har en CultureInfo parameter, till exempel Compare(String, String, Boolean, CultureInfo) och ToUpper(CultureInfo).
Bevara data
Egenskapen InvariantCulture kan användas för att bevara data i ett kulturoberoende format. Detta ger ett känt format som inte ändras och som kan användas för att serialisera och deserialisera data mellan kulturer. När data har deserialiserats kan de formateras korrekt baserat på den aktuella användarens kulturella konventioner.
Om du till exempel väljer att spara datum- och tidsdata i strängform kan du skicka InvariantCulture objektet till DateTime.ToString(String, IFormatProvider) metoden eller DateTimeOffset.ToString(IFormatProvider) för att skapa strängen, och du kan skicka InvariantCulture objektet till DateTime.Parse(String, IFormatProvider) metoden eller DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) för att konvertera strängen tillbaka till ett datum- och tidsvärde. Den här tekniken säkerställer att de underliggande datum- och tidsvärdena inte ändras när data läse eller skrivs av användare från olika kulturer.
I följande exempel används den invarianta kulturen för att bevara ett DateTime värde som en sträng. Den parsar sedan strängen och visar dess värde med hjälp av formateringskonventionerna för de franska (Frankrike) och tyska (Tyskland) kulturerna.
using System;
using System.IO;
using System.Globalization;
public class Example
{
public static void Main()
{
// Persist the date and time data.
StreamWriter sw = new StreamWriter(@".\DateData.dat");
// Create a DateTime value.
DateTime dtIn = DateTime.Now;
// Retrieve a CultureInfo object.
CultureInfo invC = CultureInfo.InvariantCulture;
// Convert the date to a string and write it to a file.
sw.WriteLine(dtIn.ToString("r", invC));
sw.Close();
// Restore the date and time data.
StreamReader sr = new StreamReader(@".\DateData.dat");
String input;
while ((input = sr.ReadLine()) != null)
{
Console.WriteLine($"Stored data: {input}\n");
// Parse the stored string.
DateTime dtOut = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind);
// Create a French (France) CultureInfo object.
CultureInfo frFr = new CultureInfo("fr-FR");
// Displays the date formatted for the "fr-FR" culture.
Console.WriteLine($"Date formatted for the {frFr.Name} culture: {dtOut.ToString("f", frFr)}");
// Creates a German (Germany) CultureInfo object.
CultureInfo deDe= new CultureInfo("de-De");
// Displays the date formatted for the "de-DE" culture.
Console.WriteLine($"Date formatted for {deDe.Name} culture: {dtOut.ToString("f", deDe)}");
}
sr.Close();
}
}
// The example displays the following output:
// Stored data: Tue, 15 May 2012 16:34:16 GMT
//
// Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
// Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
Imports System.Globalization
Imports System.IO
Module Example
Public Sub Main()
' Persist the date and time data.
Dim sw As New StreamWriter(".\DateData.dat")
' Create a DateTime value.
Dim dtIn As DateTime = DateTime.Now
' Retrieve a CultureInfo object.
Dim invC As CultureInfo = CultureInfo.InvariantCulture
' Convert the date to a string and write it to a file.
sw.WriteLine(dtIn.ToString("r", invC))
sw.Close()
' Restore the date and time data.
Dim sr As New StreamReader(".\DateData.dat")
Dim input As String = String.Empty
Do While sr.Peek() >= 0
input = sr.ReadLine()
Console.WriteLine("Stored data: {0}" , input)
Console.WriteLine()
' Parse the stored string.
Dim dtOut As DateTime = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind)
' Create a French (France) CultureInfo object.
Dim frFr As New CultureInfo("fr-FR")
' Displays the date formatted for the "fr-FR" culture.
Console.WriteLine("Date formatted for the {0} culture: {1}" ,
frFr.Name, dtOut.ToString("f", frFr))
' Creates a German (Germany) CultureInfo object.
Dim deDe As New CultureInfo("de-De")
' Displays the date formatted for the "de-DE" culture.
Console.WriteLine("Date formatted for {0} culture: {1}" ,
deDe.Name, dtOut.ToString("f", deDe))
Loop
sr.Close()
End Sub
End Module
' The example displays the following output:
' Stored data: Tue, 15 May 2012 16:34:16 GMT
'
' Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
' Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
Säkerhetsbeslut
Om du fattar ett säkerhetsbeslut (till exempel om du vill tillåta åtkomst till en systemresurs) baserat på resultatet av en strängjämförelse eller en skiftlägesändring bör du inte använda den invarianta kulturen. I stället bör du utföra en skiftlägeskänslig eller skiftlägesokänslig ordinalsjämförelse genom att anropa en metod som innehåller en StringComparison-parameter och ange antingen StringComparison.Ordinal eller StringComparison.OrdinalIgnoreCase som ett argument. Kod som utför kulturkänsliga strängåtgärder kan orsaka säkerhetsproblem om den aktuella kulturen ändras eller om kulturen på datorn som kör koden skiljer sig från den kultur som används för att testa koden. Däremot beror en ordningsjämförelse enbart på det binära värdet för de jämförna tecknen.