我们说我有一个文本框或任何其他形式的输入,要求提供社会安全号码。我想要注意的是,SSN是一个纯粹的例子,我现在只是想到了。 此输入最初将自动存储为字符串。
string s = Console.ReadLine();
让我们说我想要一个验证SSN的方法,它可能会在我的代码中用于各种各样的地方。哎呀,我甚至可能在一个尚未由用户输入确定的变量上调用该方法。
这可以接受吗?
public bool IsValidSSN(Object SSN)
{
int mySSN;
if(Int.Parse(SSN == false)
{
mySSN = Convert.toInt32(SSN);
}
...
}
或者你坚持我要求特定的数据类型,例如
public bool IsValidSSN(int SSN)
{
...
}
因此我需要在输入方法之前将输入转换为正确的数据类型。
BTW:我不是在问如何正确使用IsValidSSN代码:)我只是想举例说明我的意思:我可以接受Object数据类型作为参数,还是应该尽量避免使用它?答案 0 :(得分:7)
如果你必须接受一个对象,我至少会有一个带有强类型参数的方法的重载。然后让对象变体加入到这些方法中。
public bool IsValidSSN(object ssn) {
...
IsValidSSN(Convert.ToInt32(ssn));
...
}
public bool IsValidSSN(int ssn) {
...
}
答案 1 :(得分:2)
完全取决于您的设计以及您希望进行验证的位置。它从根本上取决于您的整体架构和类层次结构。无论如何都这样做并没有错;请确保它符合您的建筑设计。
答案 2 :(得分:1)
在这种情况下,我认为接受对象没有任何价值。想一想您希望该功能如何工作。 (显然你没有,因为你发布的代码不起作用)。我想你正在计划这样的事情:
if (SSN is string)
SSN = Convert.toInt32(SSN);
else if (SSN is TextBox)
SSN = Convert.toInt32(SSN.Value);
else /* etc */
这比那更好:
bool isValidSSN(int SSN) { /* real valuation code */ }
bool IsValidSSN(String SSN) { return isValidSSN(Convert.toInt32(SSN)); }
bool IsValidSSN(TextBox SSN) { return isValidSSN(Convert.toInt32(SSN.Value)); }
重载方法更简单,更快,因为它们更多地决定了从运行时到编译时的操作。
答案 3 :(得分:0)
在上面的示例中,创建类型化的IsValidSSN要容易得多。通常我发现打字可以减少错误和灵活性。
在最高灵活性的情况下,然后使用Object可能是最佳选择,但期望在日志中面对一些强制冲突异常。
对于所有其他情况,请严格键入,或者在python中编写。
答案 4 :(得分:0)
就个人而言,我会建立SSN课程并能够询问SSN是否有效。在业务逻辑中使用代表主体的类非常重要。例如,您可以使用需要更多验证的内容,例如信用卡类。如果你可以避开它并处理业务逻辑中的主要内容,那么处理对象并不是最好的,因为原语也很糟糕(你的架构使SSN1 + SSN2 = SSN3完全有效,即使在业务逻辑中,它也是无稽之谈)。
答案 5 :(得分:0)
在这种情况下,我会说这是不可接受的。如果输入有破折号或其他分隔符(例如:### - ## - ####),该怎么办?您显然无法将该值解析为整数,但该值仍然有效。如何使用正则表达式来确保值是您所期望的。
在使用“Object”类型作为参数方面,这在许多情况下完全有效。实际上,它在整个.NET Framework中使用(查看事件委托):
public void Control_MouseOver(object sender, MouseEventArgs e){}
这将是一个简单的Boxing / Unboxing案例,这是在.NET 2.0之前对变量执行“Generic”操作的唯一方法。
您也可以使用泛型来解决此问题,而无需进行强制转换。如果您创建一个实现类似INumeric的接口(我不知道那是否是实际接口)或IComparable,您应该能够以更优雅的方式执行操作:
public bool IsValidSNN(INumeric SSN){}