2012-07-12 16 views
6

Sólo estoy curoius ¿cómo funciona .ToUpper()? ¿Hay algún tipo de mapeo que tenga un código UTF XYZ más bajo y el código UTF XYZ1 superior?¿Cómo funciona .ToUpper()?

+0

Es posible que pueda utilizar [ILSpy] (http://wiki.sharpdevelop.net/ILSpy.ashx) o similar para averiguarlo. –

+3

Esta pregunta http://stackoverflow.com/questions/297703/how-do-you-set-strings-to-uppercase-lowercase-in-unicode parece relacionada –

+1

Eventualmente se asigna a InternalChangeCaseString que no es visible para ILSPY – Chriseyre2000

Respuesta

3

Sí, se trata de hacer uso de los metadatos Unicode. Cada carácter (punto de código Unicode) tiene un caso, así como mapeo de casos a mayúsculas y minúsculas (y caso del título). .NET usa esta información para convertir una cadena a mayúsculas o minúsculas. Puede encontrar la misma información en el Unicode Character Database.

0

String.ToUpper solo usa CurrentCulture en el núcleo.

desensamblado versión de String.ToUpper() de mscorelib.dll, se puede ver esto:

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

Por lo tanto, depende de su actual cultura. Siempre hay una sobrecarga adecuada donde se puede especificar cultura alternativa.

EDITAR

Internamente se llama nativeChangeCaseString función al final con su implementación nativa. Cómo se implementa internamente, no tengo idea, porque es algo que puede ser respondido por la persona que lo desarrolló.

Como sugiere @Tim agregar un enlace a

TextInfo.ToUpper que proporciona algo más de información sobre el tema.

+3

No estoy seguro de que realmente responda la pregunta sin embargo. Diciendo "llama a este método internamente" sin información sobre lo que hace ese método. –

+0

@GeorgeDuckett: edité mi publicación, pero como le escribí a ** la implementación ** concreta, puede ser respondida por la persona que desarrolló esa función. – Tigran

+1

@Tigran: Es posible que desee agregar el enlace a ['TextInfo.ToUpper'] (http://msdn.microsoft.com/en-us/library/fsc2y169) ya que hay más información, por ejemplo, que la devuelta la cadena puede diferir en longitud de la cadena de entrada lo que demuestra que el enfoque de mapeo de OP es incorrecto. –

0

Si usted está interesado en aspectos de diseño de ToUpper() la aplicación a continuación, puede hacer referencia a las secciones siguientes:

  • peso mosca patrón de diseño de la banda de los cuatro catálogo de patrones de diseño se utiliza para manejar la funcionalidad relacionada con carácter
  • Según este patrón de diseño, cada unidad de la colección está diseñada como un objeto que tiene un comportamiento definido, el objeto final es la colección de unidades más pequeñas
  • En el caso de Cadena, la Cadena dada se maneja como una matriz de caracteres, donde cada personaje es un objeto con comportamiento definido
  • Yendo con este patrón de diseño cuando llamamos a ToUpper(), itera sobre los caracteres de cadena y delega internamente la llamada a cada carácter. Durante la llamada ToUpper en el carácter, clase String también pasa referencia de configuración regional que contiene datos de caracteres y codificación

Si usted está interesado en la implementación real, entonces usted puede hacer referencia a la implementación de código abierto de la clase java.lang.String parte del lenguaje Java - esto es equivalente a la clase de utilidad de cadena C#.

Los siguientes son los enlaces donde se puede encontrar el código fuente de la clase java.lang.String: hay 2 métodos sobrecargados: toUpper() y toUpper (Locale).internamente toUpper() llama a Upper (Locale) con la configuración regional predeterminada, por lo que le interesará el segundo método.

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

Esperamos que esta información ayuda.