Запретить изменение значения String.Empty - PullRequest
8 голосов
/ 25 марта 2012

Частично с любопытной точки зрения и частично с точки зрения защиты от потенциальных проблем.Представьте, что худшее, что может произойти, вызвав следующее (или что-то подобное, но string.Empty - хороший пример):

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

Это может вызвать проблемы, когда где-то есть код, который выполняет x = myClass.bar ?? string.Empty.

Есть ли какой-либо способ (похожий на разные домены приложений или аналогичный) защитить от (или обнаружить) кого-либо, меняющего значения, такие как String.Empty или, возможно, SqlDateTime.MinValue (или другие подобные поля только для чтения в .NET)?

1 Ответ

7 голосов
/ 25 марта 2012

Вы можете определить свои собственные const поля в вашей сборке следующим образом:

internal const string Empty = "";

И затем выполнить проверку по String.Empty, ноэто в значительной степени бесполезное усилие.

Вы должны выполнять проверку везде, где у вас есть доступ к String.Empty, и эффективно заменять ее (поскольку вы проверяете в точке сравнения, нет смысла использовать String.Empty больше вашей версии).

Поскольку это const, значение не может быть изменено, что хорошо, но в то же время, если значение String.Empty делает когда-либо измениться (что маловероятно), вам придется внести изменения в свое значение, а затем перекомпилировать все , которое ссылается на это поле.

Конечно, вы можете сделать свою версиюreadonly, но тогда вы будете уязвимы к изменению значения посредством отражения, и вы вернетесь к тому, с чего начали.

Добавьте к этому тот факт, что если String.Empty было изменено, не толькобудут ли затронуты сравнения с полем, но я быпредставьте, что огромное количество методов в BCL просто не будет работать должным образом;глядя через Reflector, кажется, на него ссылаются несколько сотен раз в mscorlib (.NET 4.0) один :

references to String.Empty in mscorlib 4.0

Итак, вы сказали может попробовать и гарантировать, что значение не изменилось, но это просто не практично (это будет вечная игра в кошки-мышки), скорее всего, с точки зрения вашей программы, еслизначение String.Empty было изменено, мир закончился бы, и программа умерла бы ужасной смертью довольно быстро, почти сразу, как только она была изменена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...