2016-06-08 2 views
10

Im methods of System.Char sehen wir zwei Methoden zur Überprüfung, ob ein Zeichen ein Symbol ist:Warum haben C# System.Char-Methoden für Unicode-Eigenschaftstests zwei Überladungen?

public static bool IsSymbol(string s, int index) 
public static bool IsSymbol(char c) 

und ebenfalls für andere Eigenschaftstests: islower, IsLetter usw.

Warum gibt es diese Vervielfältigung? Gibt es einen Grund, Char.IsSymbol(s, idx) über Char.IsSymbol(s[idx]) vorzuziehen?

+7

Bessere Handhabung von utf16 Ersatzpaaren könnte ein möglicher Grund sein, um eine Zeichenfolge zu nehmen ich mich vorstellen. –

+7

@RaphaelMiedl [Ja, das ist es] (http://referencesource.microsoft.com/#mscorlib/system/globalization/charunicodeinfo.cs). Es verwendet GetUnicodeCategory, das InternalGetUnicodeCategory verwendet, das InternalGetCategoryValue verwendet, das UTF16-zu-UTF32-Konvertierung ausführt, die zu dem Entschlüsseln von Ersatzpaaren führen kann. –

+1

@TravisJ nicht, wenn es einen objektiven Grund gibt, warum man bevorzugt werden könnte. –

Antwort

11

An der Oberfläche scheinen beide Überlastungen funktional die gleichen zu sein, aber das Bohren bis zum Aufruf an InternalGetUnicodeCategory wird enthüllen, dass sie Aufrufe unterschiedlicher Überlastungen von CharUnicodeInfo.GetUnicodeCateogry ergeben.

Die string,int Überlastung endet Durchlauf durch eine UTF32 Konvertierung über InternalConvertToUtf32 vor derselben einzelnen charInternalGetUnicodeCategory Funktion aufruft. Dies berücksichtigt die Möglichkeit, Ersatzpaare in einem UTF16-codierten Zeichen zu dekodieren.

internal static UnicodeCategory InternalGetUnicodeCategory(String value, int index) { 
     Contract.Assert(value != null, "value can not be null"); 
     Contract.Assert(index < value.Length, "index < value.Length"); 

     return (InternalGetUnicodeCategory(InternalConvertToUtf32(value, index))); 
    } 

Check out the Conversion implementation here if you want.

Warum diese Frage könnten Sie fragen? Die Antwort darauf ist, dass .Net Textelemente unterstützt. Microsoft heißt es:

MSDN Documentation on Unicode Support for Surrogate Pairs

Ein Textelement eine Einheit von Text, der als ein einzelnes Zeichen angezeigt wird, ein Graphem genannt. Ein Textelement kann ein Basiszeichen, , ein Ersatzpaar oder eine kombinierende Zeichenfolge sein.

Während ich nicht glaube, die IsSymbol Funktion und ihre Angehörigen können Grapheme oder die Kombination von Zeichenfolgen entschlüsseln, der Grund für die callout Elemente in Text ist, dass sie können als Ersatzpaar definiert werden, und als solche würde muß über die string,int Überlastung von IsSymbol(), IsLetter() decodiert werden etc ...

Was dies bedeutet, dass ist ein Ersatzpaar über die char Überlastung vorbei das falsche Ergebnis zurückkehren würde, da die Zeichen in der Zeichenfolge ein Ersatzpaar sein könnten. Sie können nicht davon ausgehen, dass eine 16-Bit-Codierung ein einzelnes Zeichen darstellt, und die Übergabe des Zeichens der Zeichenfolge an diesen Index würde diese Annahme treffen.

Da Surrogat-Paare können in einem String in .NET dargestellt werden, wäre es, dass die Vernunft, wenn Sie mit einer Zeichenfolge handeln, die eine davon enthalten könnte, die IsSymbol(string s, int index) Überlastung wäre besser geeignet, um den Fall zu decken wo eines dieser Paare anwesend war.

Ein konkretes Beispiel, wo die Ergebnisse unterscheiden ist

string s = char.ConvertFromUtf32(128204); // "" 

Debug.Assert(char.IsSymbol(s[0]) == char.IsSymbol(s, 0)); // Fails 
+0

Aktualisiert mit einer prägnanteren und ergreifenderen Antwort ... hoffentlich :) –

+0

Sind Sie sicher, dass char.IsSymbol() und solche Zeichenfolgen kombinieren? Das ist noch überraschender. Basierend auf der vorherigen Diskussion würde ich erwarten, dass sie nur an Codepunkten arbeiten (d. H. Nur Decodierersatzpaare). –

+0

Ich bin nicht sicher im Fall der Kombination von Sequenzen, aber ein Text-Element ist als Ersatz-Paar oder eine Kombination Zeichenfolge definieren, so dass ich wirklich nur ihre mögliche Argumentation für die Überlastung beantworten. Es wäre interessant zu sehen, ob sie auch die Sequenzen bearbeiten. –

Verwandte Themen