2016-06-08 9 views
10

Nel methods of System.Char, vediamo due metodi di controllo se un personaggio è un simbolo:Perché i metodi C# System.Char per i test delle proprietà Unicode hanno due overload?

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

e allo stesso modo per altre prove di proprietà: islower, IsLetter, ecc

Perché c'è questa duplicazione? C'è qualche motivo per preferire Char.IsSymbol(s, idx) su Char.IsSymbol(s[idx])?

+7

Migliore gestione delle coppie di surrogati UTF16 potrebbe essere una ragione possibile per prendere una stringa immagino. –

+7

@RaphaelMiedl [Sì, è così] (http://referencesource.microsoft.com/#mscorlib/system/globalization/charunicodeinfo.cs). Utilizza GetUnicodeCategory, che utilizza InternalGetUnicodeCategory, che utilizza InternalGetCategoryValue, che esegue la conversione da UTF16 a UTF32, che potrebbe determinare la decodifica delle coppie di surrogati. –

+1

@TravisJ non se c'è una ragione obiettiva per cui si potrebbe essere preferiti. –

risposta

11

In superficie entrambi i sovraccarichi sembrano essere funzionalmente uguali, tuttavia il drill-down fino alla chiamata a InternalGetUnicodeCategory rivelerà che provocano chiamate a diversi sovraccarichi di CharUnicodeInfo.GetUnicodeCateogry.

Il string,int sovraccarico finisce che attraversa una conversione UTF-32 tramite InternalConvertToUtf32 prima del richiamo del medesimo unico charInternalGetUnicodeCategory funzione. Questo spiega la possibilità di decodificare coppie di surrogati in un carattere codificato UTF16.

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.

Perché questa materia si può chiedere? Beh, la risposta è che .Net supporta gli elementi di testo. Microsoft afferma:

MSDN Documentation on Unicode Support for Surrogate Pairs

Un elemento di testo è un'unità di testo che viene visualizzato come un singolo carattere, chiamato grafema. Un elemento di testo può essere un carattere di base, una coppia surrogata o una sequenza di caratteri combinati.

Mentre non credo la funzione IsSymbol ei suoi parenti può decodificare Grafemi o combinando sequenze di caratteri, il motivo per il richiamo agli elementi di testo è che possono essere definiti come una coppia di surrogati, e come tale sarebbe bisogno di essere decodificato tramite il string,int sovraccarico IsSymbol(), IsLetter() ecc ...

ciò significa che passare una coppia di surrogati tramite il char sovraccarico sarebbe tornato il risultato sbagliato, perché il carattere della stringa potrebbe essere una coppia di surrogati. Non si può presumere che una codifica a 16 bit rappresenti un singolo carattere, e il fatto di passare il carattere della stringa a detto indice potrebbe rendere tale ipotesi.

Poiché le coppie di surrogati possono essere rappresentati in una stringa in Net, sarebbe ragionare che se si tratta di una stringa che potrebbe contenere uno di questi, il sovraccarico IsSymbol(string s, int index) sarebbe più appropriato per coprire il caso dove era presente una di queste coppie.

Un esempio specifico in cui i risultati differiscono è

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

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

Aggiornato con una risposta più concisa e toccante ... si spera :) –

+0

Sei sicuro che char.IsSymbol() e simili operano sulla combinazione di sequenze di caratteri? Questo è ancora più sorprendente. Basandomi sulla discussione precedente, mi aspetterei che funzionassero solo su punti codice (ad esempio, decodificare solo coppie surrogate). –

+0

Non sono sicuro nel caso di combinazioni di sequenze, tuttavia un elemento di testo è definito come una coppia surrogata _o_ una sequenza di caratteri combinati, quindi in realtà sto solo rispondendo al loro potenziale ragionamento per il sovraccarico. Sarebbe interessante vedere se operano anche sulle sequenze. –

Problemi correlati