字符串或其他密封类的强类型

时间:2012-03-26 18:02:12

标签: c# string inheritance strong-typing

我用通用术语来表达我的例子,因为它可以解决问题,而无需深入了解我的具体问题细节。

假设您有一堆将字符串作为参数的方法。假设一个字符串是一个人的“名字”而另一个字符串是一个人的“姓氏”。可能还有其他字符串,如“最喜欢的食物”。

现在,在您的代码中,您将继续查找运行时错误,因为您正在混淆参数。您可以切换“名字”和“姓氏”的顺序,或在您应该使用另一个时使用一个。强类型语言的价值在于它会在构建时而不是运行时发现这些错误。

因此,一种可能的解决方案是从字符串派生类。

public class FirstName : String
{
}

public class LastName : String
{
}

现在,如果您传递了错误类型的字符串,编译器会抱怨。 以上是不可能的,因为String是密封的。 另外,“using”语句不起作用(我认为),因为编译器在混合时不会抱怨。

using LastName = String;

当然,我可以构建包装字符串的类,然后编写强制转换方法,但这似乎比它的价值更麻烦。

4 个答案:

答案 0 :(得分: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")

输出:

  

Bryan Crosby

仍然会密切关注您的代码,看看您是否可以重构方法和类。

答案 1 :(得分: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)
    {

    }
}

答案 2 :(得分:1)

只是不要忘记创建像

这样的其他类
A-FileStreamReader : StreamReader
B-FileStreamReader : StreamReader
Age : int
Phone : long
...
...
SLaksPhoneNumer : string // added under pressure...    

解决方案是,使用正确的参数调用方法,当方法请求firstName给出而不是lastName ...

顺便说一句,什么会妨碍你做(在编译时或在RUNTIME中):

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

答案 3 :(得分:0)

很难说出你的问题到底是什么。

例如,如果你有一个方法,它需要6个字符串参数,并且将来可能需要7个,也许你应该只创建一个具有相关6个属性的强类型对象(将来你可以扩展它)添加第7个 - 无需修改方法上的签名)。然后你的方法可以接受一个参数,这是你的强类型对象,它包含你方法的相关参数。