2008-09-16 6 views

Respuesta

5

ECMA-335 especifica algunos más CompilationRelaxations para manejar (los llamados e-relajada llamadas) en el anexo F "defectos" imprecisos excepción relajado, pero no han sido expuestos por Microsoft.

Específicamente CompilationRelaxations.RelaxedArrayExceptions y CompilationRelaxations.RelaxedNullReferenceException se mencionan allí.

Sería interesante lo que pasa cuando se acaba de tratar algunos números enteros en ctor del CompilationRelaxationsAttribute;)

+0

http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Runtime/CompilerServices/CompilationRelaxations.html –

1

Encontré otra: NeutralResourcesLanguageAttribute. De acuerdo con la publicación del blog this, ayuda al cargador a encontrar los ensamblajes satelitales correctos más rápidamente al especificar la cultura si el ensamblaje actual (neutral).

[NeutralResourcesLanguageAttribute("nl", UltimateResourceFallbackLocation.MainAssembly)] 
2

y otro: Las cadenas literales (cadenas declaradas en el código fuente) son de forma predeterminada interned en una piscina para ahorrar memoria.

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references. 
Console.WriteLine((Object)s3==(Object)s1); // The same reference. 

Aunque se ahorra memoria cuando la misma cadena literal se utiliza varias veces, cuesta un poco de CPU para el mantenimiento de la piscina y una vez que una cadena se pone en la piscina se queda allí hasta que se detuvo el proceso.

Usando CompilationRelaxationsAttribute puede decirle al compilador JIT que realmente no quiere que interne todas las cadenas literales.

[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)] 
+1

tener cuidado con esto, ya que las cadenas no internar en realidad podría perjudicar el rendimiento. La comparación de igualdad para cadenas internas se puede realizar simplemente comparando las referencias (punteros), que es mucho más rápido que la comparación de los valores de cadena. – csgero

+0

Es cierto, pero luego tendría que escribir un código que explícitamente hace uso de la cadena de internados. Y como no puedes contar con literales para ser internado, debes hacerlo tú mismo (String.Intern). El atributo mencionado aquí no influye en eso. –

+1

El operador == para string sabe si necesita comparar referencias o contenido. El punto de csgero parecía ser que en el caso no interno, el operador == siempre tiene que hacer comparaciones basadas en el contenido que pueden ser más costosas que la comparación basada en referencias para cadenas internas. –

Cuestiones relacionadas