【问题标题】:Is accepting Object as a parameter acceptable?接受 Object 作为参数是否可以接受?
【发布时间】:2009-06-08 22:35:38
【问题描述】:

假设我有一个文本框或任何其他形式的要求输入社会保险号的输入。我确实想指出,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)
{
...
}

因此,我需要在调用方法之前将输入转换为正确的数据类型。

顺便说一句:我不是在问如何做一个正确的 IsValidSSN 代码:) 我只是想举例说明我所说的意思:我可以接受 Object 数据类型作为参数还是应该尽量避免它?

【问题讨论】:

    标签: c# type-conversion conventions


    【解决方案1】:

    如果你必须接受一个对象,我至少会重载采用强类型参数的方法。然后让对象变体输入这些方法。

    public bool IsValidSSN(object ssn) {
      ...
      IsValidSSN(Convert.ToInt32(ssn));
      ...
    }
    
    public bool IsValidSSN(int ssn) {
      ...
    }
    

    【讨论】:

      【解决方案2】:

      这完全取决于您的设计以及您希望在哪里进行验证。它实际上从根本上取决于您的整体架构和您的类层次结构。无论哪种方式都没有错。只需确保它适合您的建筑设计。

      【讨论】:

        【解决方案3】:

        在这种情况下,我认为接受 Object 没有任何价值。仔细考虑您希望该功能如何工作。 (显然你没有,因为你发布的代码不起作用)。我认为您正在计划这样的事情:

        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)); }
        

        重载的方法更简单、更快,因为它们更多地决定了从运行时到编译时要做什么。

        【讨论】:

        • 好吧,整个 SSN 代码只是我在思考问题时编写的一个虚构示例。更多的是提供我的想法的说明,而不是工作代码。谢谢你的例子
        【解决方案4】:

        在上面的示例中,创建类型化的 IsValidSSN 要容易得多。一般来说,我发现打字可以减少错误和灵活性。

        在灵活性至关重要的情况下,使用 Object 可能是最佳选择,但预计会在日志中遇到一些强制转换冲突异常。

        对于所有其他情况,请严格输入,或用 python 编写。

        【讨论】:

          【解决方案5】:

          就个人而言,我会开设一个 SSN 课程,并能够询问该 SSN 是否有效。在业务逻辑中拥有代表主体的类很重要。例如,这非常类似于信用卡类等需要更多验证的事情。如果您可以避免将对象交给对象并不是最好的,并且将业务逻辑中的主体作为原语处理也是不好的(您的架构使 SSN1 + SSN2 = SSN3 完全有效,即使在业务逻辑中,这是无稽之谈)。

          【讨论】:

            【解决方案6】:

            在这种情况下,我会说这是不可接受的。如果输入有破折号或其他分隔字符(例如:###-##-####)怎么办?您显然无法将值解析为整数,但该值仍然有效。不如使用正则表达式来确保值是您想要的。

            就使用“对象”类型作为参数而言,这在许多情况下是完全有效的。事实上,它在整个 .NET Framework 中都使用过(查看事件委托):

            public void Control_MouseOver(object sender, MouseEventArgs e){}
            

            这将是一个简单的装箱/拆箱案例,这实际上是在 .NET 2.0 之前对变量执行“通用”操作的唯一方法。

            您也可以使用泛型来解决此问题,而无需强制转换。如果您创建一个实现类似 INumeric(我不知道这是否是实际接口)或 IComparable 的接口,您应该能够以更优雅的方式执行操作:

            public bool IsValidSNN(INumeric SSN){}

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-06
              • 1970-01-01
              • 1970-01-01
              • 2021-04-28
              • 2017-12-14
              • 2023-03-25
              相关资源
              最近更新 更多