[英]Strong-typing for strings or other sealed classes
我用通用術語表述我的示例,因為它可以說明要點,而不必深入研究我的特定問題細節。
假設您有一堆將字符串作為參數的方法。 假設一個字符串是一個人的“名字”,而另一個則是一個人的“姓氏”。 可能還有其他字符串,例如“最喜歡的食物”。
現在,在代碼中,您一直在查找運行時錯誤,因為您正在混淆參數。 您可以切換“名字”和“姓氏”的順序,也可以在應該使用另一個時使用一個。 強類型語言的價值在於它將在構建時而不是運行時發現這些錯誤。
因此,一種可能的解決方案是僅從字符串派生類。
public class FirstName : String
{
}
public class LastName : String
{
}
現在,如果您傳遞了錯誤的字符串類型,編譯器將抱怨。 由於String是密封的,因此上述操作是不可能的。 另外,“使用”語句將不起作用(我認為),因為當我將它們混合使用時,編譯器不會抱怨。
using LastName = String;
當然,我可以構建包裝字符串的類,然后編寫強制轉換方法,但這似乎比它值得的麻煩更多。
現在,在代碼中,您一直在查找運行時錯誤,因為您正在混淆參數。 您可以切換“名字”和“姓氏”的順序,也可以在應該使用另一個時使用一個。 強類型語言的價值在於它將在構建時而不是運行時發現這些錯誤。
很難說出您的真正問題是什么。 鑒於此,開發商應承擔一些責任。 我們在這里討論多少個參數? 如果您有多個參數,則通常意味着您需要重構代碼。 例如:
void MyMethod(string firstName, stringMiddleName, string lastName,
string phoneNumber, string email, string country, string city,
string state, string zipcode, string countryISO,
string pseudonym, string title, string addressLine1, string addressLine2)
顯然那是令人費解的。 創建一個包含大部分(如果不是全部)參數的ContactInfo
對象,然后可以編寫:
void MyMethod(ContactInfo contact)
編輯:
如果使用的是VS2010,則可以使用命名參數功能。 這使您可以以其他順序傳遞它們。
string ConcatName(string firstName, string lastName)
{
return (firstName + " " + lastName);
}
string myName = ConcatName(lastName: "Crosby", firstName: "Bryan")
輸出:
布萊恩·克羅斯比
我仍然會仔細查看您的代碼,看看是否可以重構方法和類。
我不知道您的目標是什么,但您似乎對此很認真:)因此,可能的解決方案是使用通用容器類。 確實比從密封類繼承要舒適。
public class Container<T>
{
public T Value { get; protected set; }
public Container(T value)
{
Value = value;
}
}
public class FirstName : Container<string>
{
public FirstName(string firstName) : base(firstName) { }
}
public class LastName : Container<string>
{
public LastName(string lastName) : base(lastName) { }
}
public class Age : Container<int>
{
public Age(int age) : base(age) { }
}
public class Program
{
public void Process(FirstName firstName, LastName lastName, Age age)
{
}
}
只是別忘了再上一堂課
A-FileStreamReader : StreamReader
B-FileStreamReader : StreamReader
Age : int
Phone : long
...
...
SLaksPhoneNumer : string // added under pressure...
解決方法是,當方法要求firstName給它而不是lastName時,使用正確的參數調用方法。
順便說一下,什么會阻止您這樣做(在編譯時或在運行時):
new FirstName("Skeet");
new LastName("Jon");
很難說出您的問題到底是什么。
例如,如果您有一個采用6個字符串參數的方法,並且將來可能采用7個方法,也許您應該只創建一個具有相關6個屬性的強類型對象(將來您可以擴展該屬性以添加7-無需修改方法上的簽名)。 然后,您的方法可以只接受一個參數,這是您的強類型對象,其中包含與方法相關的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.