簡體   English   中英

字符串或其他密封類的強類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM