是否接受Object作为参数?

时间:2009-06-08 22:35:38

标签: c# type-conversion conventions

我们说我有一个文本框或任何其他形式的输入,要求提供社会安全号码。我想要注意的是,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数据类型作为参数,还是应该尽量避免使用它?

6 个答案:

答案 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){}