我用通用术语来表达我的例子,因为它可以解决问题,而无需深入了解我的具体问题细节。
假设您有一堆将字符串作为参数的方法。假设一个字符串是一个人的“名字”而另一个字符串是一个人的“姓氏”。可能还有其他字符串,如“最喜欢的食物”。
现在,在您的代码中,您将继续查找运行时错误,因为您正在混淆参数。您可以切换“名字”和“姓氏”的顺序,或在您应该使用另一个时使用一个。强类型语言的价值在于它会在构建时而不是运行时发现这些错误。
因此,一种可能的解决方案是从字符串派生类。
public class FirstName : String
{
}
public class LastName : String
{
}
现在,如果您传递了错误类型的字符串,编译器会抱怨。 以上是不可能的,因为String是密封的。 另外,“using”语句不起作用(我认为),因为编译器在混合时不会抱怨。
using LastName = String;
当然,我可以构建包装字符串的类,然后编写强制转换方法,但这似乎比它的价值更麻烦。
答案 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个 - 无需修改方法上的签名)。然后你的方法可以接受一个参数,这是你的强类型对象,它包含你方法的相关参数。