2012-07-12 13 views
6

Sono solo curioso come funziona .ToUpper()? Esiste una sorta di mappatura che più bassa ha il codice UTF XYZ e quello superiore ha il codice UTF XYZ1?Come funziona .ToUpper()?

+0

Potrebbe essere possibile utilizzare [ILSpy] (http://wiki.sharpdevelop.net/ILSpy.ashx) o simile per scoprirlo. –

+3

Questa domanda http://stackoverflow.com/questions/297703/how-do-you-set-strings-to-uppercase-lowercase-in-unicode sembra correlata –

+1

Si associa infine a InternalChangeCaseString che non è visibile a ILSPY – Chriseyre2000

risposta

3

Sì, è facendo uso dei metadati Unicode. Ogni carattere (punto di codice Unicode) ha un caso e la mappatura del caso in maiuscolo e minuscolo (e titolo). .NET utilizza queste informazioni per convertire una stringa in maiuscolo o minuscolo. È possibile trovare le stesse informazioni nello Unicode Character Database.

0

String.ToUpper utilizza solo lo CurrentCulture nel core.

smontate versione di String.ToUpper() da mscorelib.dll, si può vedere questo:

public string ToUpper(CultureInfo culture) 
{ 
    if (culture == null) 
    { 
     throw new ArgumentNullException("culture"); 
    } 
    return culture.TextInfo.ToUpper(this); 
} 

Quindi dipende dal vostro corrente cultura. C'è sempre un sovraccarico adatto in cui è possibile specificare una cultura alternativa.

EDIT

Internamente chiama nativeChangeCaseString funzione alla fine con la sua nativo attuazione. Come viene implementato internamente, non ne ho idea, perché è qualcosa che può essere risolto da chi lo ha sviluppato.

Come suggerito da @ Tim aggiungere un link a

TextInfo.ToUpper che fornisce qualche informazione in più sul soggetto.

+3

Non sono sicuro che risponda davvero alla domanda. Dire "chiama questo metodo internamente" senza informazioni su cosa faccia quel metodo. –

+0

@GeorgeDuckett: ho modificato il mio post, ma come ho scritto per ** concreto ** l'implementazione può essere risolta dalla persona che ha sviluppato quella fazione. – Tigran

+1

@Tigran: è possibile aggiungere il collegamento a ['TextInfo.ToUpper'] (http://msdn.microsoft.com/en-us/library/fsc2y169) poiché ci sono ulteriori informazioni, ad esempio che il reso la stringa potrebbe differire in lunghezza dalla stringa di input, il che dimostra che l'approccio di mappatura dell'OP non è corretto. –

0

Se siete interessati agli aspetti di progettazione di ToUpper() implementazione poi si può fare riferimento alle seguenti sezioni:

  • peso mosca modello di progettazione dalla Banda dei Quattro catalogo design pattern viene utilizzato per gestire carattere funzionalità relative
  • In base a questo modello di progettazione, ciascuna unità della collezione è progettata come un oggetto che ha un comportamento definito, l'oggetto finale è una raccolta di unità più piccole
  • Nel caso di String, la stringa data viene effettivamente gestita come matrice di caratteri, dove ciascuno il carattere è un oggetto con comportamento definito
  • Con questo modello di progettazione, quando chiamiamo ToUpper(), itera sopra i caratteri della stringa e delega internamente la chiamata a ciascun carattere. Durante la chiamata ToUpper sul carattere, classe String passa anche riferimento Locale che contiene dettagli della mappa dei caratteri e la codifica

Se siete interessati a concreta attuazione, allora si può fare riferimento alla implementazione open source di classe java.lang.String parte del linguaggio Java - questo è equivalente alla classe di utilità stringa C#.

Di seguito sono riportati i collegamenti in cui è possibile trovare il codice sorgente della classe java.lang.String - ci sono 2 metodi sovraccaricati: toUpper() e toUpper (Locale).internamente toUpper() chiamaUser (Locale) con le impostazioni internazionali predefinite, quindi il secondo metodo sarà di tuo interesse.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java

Spero che queste informazioni aiuta.