2012-03-25 7 views
7

Parcialmente desde un punto de vista de cosas que rompen de manera curiosa y en parte desde una protección contra posibles problemas. Imagínese lo que es lo peor que le puede pasar al llamar al siguiente (o algo similar, pero string.Empty es un buen ejemplo):Evite cambiar el valor de String.Empty

typeof(String).GetField("Empty", 
    BindingFlags.Public | 
    BindingFlags.NonPublic | 
    BindingFlags.Static | 
    BindingFlags.GetField 
).SetValue(null, "foo"); 

Esto causaría problemas cuando no hay código en alguna parte que hace x = myClass.bar ?? string.Empty.

¿Hay alguna forma (similar a los diferentes dominios de aplicación o similares) de proteger contra (o detectar) a alguien que cambia valores como String.Empty o quizás el SqlDateTime.MinValue (u otros campos de solo lectura similares en .NET)?

+0

¿Tienes un problema? http://stackoverflow.com/questions/4447939/is-it-possible-to-disable-reflection-from-a-net-assembly – harold

+6

No puede evitar que el código de confianza haga cosas malas. Y el código que no es de confianza no puede modificar 'string.Empty'. Y el tiro en el pie es bastante explícito en este caso. – CodesInChaos

+1

Por cierto, ¿el campo 'Int.MaxValue' no es * constant *? – harold

Respuesta

5

Se podría definir sus propios campos en constsu montaje así:

internal const string Empty = ""; 

Y a continuación, realizar una comprobación contra String.Empty, pero es más bien un esfuerzo inútil.

Debería realizar un control dondequiera que acceda al String.Empty y reemplazarlo efectivamente (ya que lo comprobaría en el punto de comparación, ya no tiene sentido utilizar String.Empty en su versión).

Ya que es const, el valor podría no ser cambiado, lo cual es bueno, pero al mismo tiempo, si el valor de String.Empty no cambia nunca (aunque poco probable), que tendrá que hacer el cambio a su valor, y luego recompilar todo que haga referencia a ese campo.

Por supuesto, podría hacer su versión readonly, pero entonces sería vulnerable a que se cambiara el valor a través de la reflexión, y usted está justo donde comenzó.

A esto se añade el hecho de que si String.Empty fue cambiado, no sólo se verían afectadas las comparaciones con el campo, pero me imagino una tremenda número de métodos en el BCL simplemente no funcionaría adecuadamente; mirando a través del reflector, parecería que está referenciado a unos cientos de veces en mscorlib (.NET 4.0) sola:

references to String.Empty in mscorlib 4.0

de manera que dicho, se podría intentar y garantizar que el valor no era cambiado, pero simplemente no es práctico (será un juego eterno del gato y el ratón), lo más probable es que, desde la perspectiva de su programa, si se cambiara el valor de String.Empty, el mundo terminaría, y el programa moriría una muerte horrible con bastante rapidez casi tan pronto como se cambiara.

Cuestiones relacionadas