如何实现调用自身的方法?

4

由于在任务中我调用了一个方法并且发生了输入错误,所以我受到了惩罚。我不知道如何替换我编写的代码或者使用什么替代方案。我需要帮助找到正确的方法来解决这个问题。

我喜欢编码,所以只需要一个正确的指引! :)

我编写的代码看起来像这样。

 private void SumTheNumbers()
 {
 Console.Write("Please give the value no "+ index + " :");
        if (false == int.TryParse(Console.ReadLine(), out num))
        { 
            //Errormessage if the user did not input an integer.
            Console.WriteLine("Your input is not valid, please try again.");
            Console.WriteLine();
            sum = 0;
            SumTheNumbers();
        }
        else
        {
            //Calculate the numbers given by user
            sum += num;
        }
  }

2
这段代码更糟糕的风格问题在于使用了全局变量。 - Ben Voigt
1
@BenVoigt - 他们可能正在从私有方法中访问类成员。我认为这没有问题。但理想情况下,我会尽量保持我的函数尽可能纯净,但你并不总是能做到这一点。 - ChaosPandion
2
@ChaosPandion:num 没有作为一个类成员的充分理由,而且它作为一个局部变量有几个好处。这是不好的编程风格。 - Ben Voigt
1
@BenVoigt - 我同意你的观点,但是你也在假设我们朋友的代码,并且发表了一个笼统的声明,他们肯定不会理解程序。为了让你的评论有用,他们需要上下文和示例。 - ChaosPandion
1
在将克隆推到最顶部之前,你的方法从堆栈中永远不会弹出。你的堆栈里满是小跟班。 - Tyler Pantuso
显示剩余2条评论
3个回答

8

个人而言,我有点喜欢那种风格,但它效率不高(如果用户输入无效的数据很多次,可能会导致堆栈溢出)。你的教练可能希望你使用 while 循环:

Console.Write("Please give the value no "+ index + " :");
while (false == int.TryParse(Console.ReadLine(), out num))
{ 
    //Errormessage if the user did not input an integer.
    Console.WriteLine("Your input is not valid, please try again.");
    Console.WriteLine();
    sum = 0;
}

//Calculate the numbers given by user
sum += num;

顺便说一下,那个 false == 部分非常不符合惯用语,大多数团队都会对此感到诧异(顺便提一句:如果您的讲师建议您这样写,他/她可能来自于不同的语言背景,在那里它是防止意外赋值的保障;相信我,在C#领域中这不是必要的或正常的)。这看起来更加典型:

while (!int.TryParse(Console.ReadLine(), out num))
{
    // etc.
}

2
在 C 语言中,你可能会遇到一个不幸的问题,即显式相等性检查和“布尔值”(例如 TRUE == SomeMethod(),而 SomeMethod 返回 -1 而不是 !0)。布尔值根本不应该被显式地与“false”或“true”进行比较。 - user7116
1
@sixlettervariables:在C语言中,1 == !0。也许你的意思是-1或者~0 - Ben Voigt
1
@sixlettervariables:你说得对,我混淆了两个问题。我重新措辞评论,以免误导地单独指出C语言。 - Dan Tao
哈哈,我已经改成了 while (!int.TryParse(Console.ReadLine(), out num)),这样就不会引起太多注意了!;) - user1501127

7

实现这个的标准方式是使用while循环。

int num;
while (!int.TryParse(Console.ReadLine(), out num))
{
    Console.WriteLine("Your input is not valid, please try again.\n");
}

谢谢大家的帮助!num已经完蛋了;)我把它移动了一下,以便更好地排版:)之前我尝试让while循环和switch/case都能正常工作,但是没成功。现在我有一个while循环正在运行并且正常工作。编程方面还有很多东西需要我学习,而且似乎我学得越多,就越发现还有更多要学的。 - user1501127
1
@user1501127 - 保持乐观,记住我们都要从零开始。 - ChaosPandion

1
使用 while 循环。
Console.Write("Please give the value no "+ index + " :");
while(!int.TryParse(Console.ReadLine(), out num))   //I find "!" easier to read then "false == "
{
    Console.WriteLine("Your input is not valid, please try again.");
    Console.WriteLine();
    Console.Write("Please give the value no "+ index + " :");
}

这里不需要递归,因此使用do while循环更好。


1
@sixlettervariables OP 表示:“我喜欢编程,只需要在正确的方向上给我一点推动!” 推荐可以尝试使用循环。你应该学会如何回答实际问题,而不是挑剔别人。 - Trisped
1
我认为这个变量只会增加太多的语法噪音。 - ChaosPandion
1
@ChaosPandion 是的,那只是一个快速编写。我原本想使用 do 循环,但后来意识到“请给...”文本必须再次打印,所以我选择了另一种方式进行编写。 - Trisped

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接