Choć pytanie zostało odebrane jakiś czas temu, myślałem o tym samym problemem ostatnio. Sformalizowane umowy kodowe (z automatyczną weryfikacją lub kontrolą) wydają się dobrym pomysłem, ale ogólnie ich zdolność weryfikacji jest dość ograniczona, a dla prostych sprawdzeń, takich jak sprawdzanie pustych lub pustych ciągów, wymagają one tyle samo kodu (lub więcej) niż staromodne kontrole.
Paradoksalnie, najlepszą odpowiedzią moim zdaniem za sznurek przypadku jest rzeczywiście jedną lub dwie klasy, które zawinąć ciąg znaków, który został sprawdzony, aby nie być null, pusta lub white-space, i przekazać tę instancję wokół:
public class NonEmptyString : IComparable<NonEmptyString>, ...
{
private readonly string _value;
public NonEmptyString(string value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (value.Length == 0)
{
throw NewStringIsEmptyException("value");
}
_value = value;
}
public string Value
{
get { return _value; }
}
...
}
public class NonWhiteSpaceString : NonEmptyString
{
....
}
Jasne, przechodząc wokół tych przypadkach nie uniemożliwi konieczności sprawdzenia, czy są one wartość null siebie, ale ma pewne duże zalety:
- nie trzeba sprawdzić na pusty lub biało ciągi spacji w kółko, które mogą być podatne na błędy w sytuacjach, w których ciąg znaków jest dużo przekazywany.
- Tak jak zrobiłem w mojej implementacji, sprawdzanie wartości NULL jest czymś innym niż sprawdzanie pustej wartości (lub wartości białej spacji), ponieważ chcesz rzucić określony ArgumentNullException w poprzednim przypadku, a także ArgumentException w drugim.
- Wyraźnie sygnalizuje ograniczenie wartości ciągu, tak jak ma to robić każda klasa owijająca. W rzeczywistości, jeśli masz łańcuch, który ma jakiekolwiek ograniczenia i jest on przekazywany dużo, zawsze zalecam zawinięcie go w klasę, która hermetyzuje czek i utrzymuje resztę kodu z kłopotów. Dobrym tego przykładem są łańcuchy, które muszą spełniać pewien regularny wyraz. Jednak odejdę od pytania tutaj ...
Możesz znaleźć ten link w [Sprawdzanie argumentu za pomocą atrybutu i metody przechwytywania] (http://www.codinginstinct.com/2008/05/argument- validation-using-attributes.html) użyteczne – Joe