首先讓我解釋一下我目前是如何處理的驗證,也就是說,對於IPv4地址:我知道我在做驗證錯誤。請說服我停止:)
public struct IPv4Address {
private string value;
private IPv4Address(string value) {
this.value = value;
}
private static IPv4Address CheckSyntax(string value) {
// If everything's fine...
return new IPv4Address(value);
// If something's wrong with the syntax...
throw new ApplicationException("message");
}
public static implicit operator IPv4Address(string value) {
return CheckSyntax(value);
}
public static implicit operator string(IPv4Address address) {
return address.value;
}
}
我有一堆像這樣的結構的。
他們經常有額外的私人成員來處理事情,但不公開暴露方法。
下面是一個簡單的用法:
IPv4Address a;
IPv4Address b = "1.2.3.4";
a = b;
b = "5.6.7.8";
string address = a;
// c contains "1.2.3.4"
IPv4Address c = address;
// See if it's valid
try {
IPv4Address d = "111.222.333.444";
}
catch (ApplicationException e) {
// Handle the exception...
}
我能感覺到有什麼東西非常令人不安的這個問題,所以我琢磨一下與像IsIPv4Address方法等切換到靜態類。
現在,這裏就是我認爲是錯誤的與上面的方法:
新的團隊成員將不得不環繞此
他們的頭它可能會妨礙與第三方代碼集成
異常昂貴
從未見過這樣的事情,我是一個保守的ative類型的心臟:)
然後呢我喜歡它:
非常接近有很多專門的原語,因爲你有值類型。
實際上,它們可以像基本類型那樣經常使用,例如,它不是將上述結構傳遞給接受字符串的方法的問題。
而且,我最喜歡的是,您可以在對象之間傳遞這些結構,並確保它們包含語法上有效的值。這也避免了必須經常檢查正確性,如果不必要地甚至遺忘,這可能是昂貴的。
我無法找到上述方法的致命缺陷(這裏只是一個初學者),您怎麼看?
編輯:正如你可以從第一行推斷這只是一個例子,我沒有要求一種方法來驗證IP地址。
是什麼毛病System.Net.IPAddress? – Joey 2009-09-04 14:56:04
@Johannes:我想他很想知道,如果有什麼,他的驗證架構是錯誤的,而不是這個特定的方法。 – Beska 2009-09-04 14:56:55
難道你不能只使用inet_aton(來自unix http://linux.about.com/library/cmd/blcmdl3_inet_aton.htm)?在你的平臺上應該有一個相同的東西。 請確保支持IPv6地址;) – tonfa 2009-09-04 15:00:28