2012-03-26 34 views
8

我是用通用術語表示我的示例,因爲它獲得了點而不必進入我的具體問題詳細信息。強鍵入字符串或其他密封類

假設你有一堆以字符串作爲參數的方法。假設一個字符串是一個人的「名字」,另一個字符串是一個人的「姓氏」。可能有其他的字符串,如「最喜歡的食物」。

現在,在您的代碼中,您將繼續查找運行時錯誤,因爲您正在獲取混合的參數。您可以切換「名字」和「姓氏」的順序,或者在使用其他名稱時使用。強類型語言的價值在於它會在構建時發現這些錯誤,而不是運行時。

所以,一種可能的解決方案是從字符串中派生類。

public class FirstName : String 
{ 
} 

public class LastName : String 
{ 
} 

現在,如果您傳遞了錯誤類型的字符串,編譯器會抱怨。 以上是不可能的,因爲字符串是密封的。 此外,「使用」語句不會工作(我認爲),因爲編譯器不會抱怨,當我混合起來。

using LastName = String; 

當然,我可以建立包裝字符串然後編寫轉換轉換方法的類,但是這看起來更麻煩而不值得。

+2

請不要在「C#」等前加上標題。這就是標籤的用途。 – 2012-03-26 18:03:39

+0

爲什麼不使用命名參數(在VS2010版本的C#中引入)來避免切換或排序參數問題,而不是僅僅通過更強大的輸入使生活變得困難? http://msdn.microsoft.com/en-us/library/dd264739.aspx – 2012-03-26 18:15:35

回答

1

只是不要忘了再拍類,如

A-FileStreamReader : StreamReader 
B-FileStreamReader : StreamReader 
Age : int 
Phone : long 
... 
... 
SLaksPhoneNumer : string // added under pressure...  

的解決方案是,調用與正確的參數的方法,當該方法要求的firstName給它,而不是名字......

順便說一句,什麼會阻止你(在編譯時或運行時)這樣做:

new FirstName("Skeet"); 
new LastName("Jon"); 
+2

_電話號碼是字符串,而不是longs_ – SLaks 2012-03-26 18:08:19

+1

@SLaks。編輯。幽默++ – gdoron 2012-03-26 18:09:21

+1

「只是不要犯錯誤」。現在爲什麼我沒有想到:^) – ChuckZ 2012-03-26 18:26:43

0

這很難說,你的問題是什麼。

例如,如果您有一個方法,例如,需要6個字符串參數,並且可能在將來需要7個參數,也許您應該創建一個強類型對象,該對象具有相關的6個屬性(將來您可以擴展到添加第7個 - 避免修改該方法上的簽名的需要)。然後你的方法可以接受一個參數,這是你的強類型對象,它包含你的方法的相關參數。

2

現在,在您的代碼中,您將繼續查找運行時錯誤,因爲您正在獲取混合的參數。您可以切換「名字」和「姓氏」的順序,或者在使用其他名稱時使用。強類型語言的價值在於它會在構建時發現這些錯誤,而不是運行時。

很難說你的問題真的是是。鑑於此,在開發者方面應該有一些責任。我們在這裏討論的究竟有多少個參數?如果你有多個參數,那通常意味着你需要重構你的代碼。例如:

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") 

輸出:

布賴恩·克羅斯比

仍然將密切看看你的代碼,看看你是否可以重構方法(S)和類。

2

我不知道你的目標是什麼,但你似乎認真對待它:)所以一個可能的解決方案是使用通用的容器類。它確實比繼承密封課程不太舒服。

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) 
    { 

    } 
} 
+0

你明白了。這是我正在尋找的。 – ChuckZ 2012-03-26 18:21:39

+0

@ChuckZ。所以你會有數千個類用於每個用途? – gdoron 2012-03-26 18:23:27

+0

我敢肯定他有充分的理由使用這個:) – MatthiasG 2012-03-26 18:23:38

相關問題