比较ReadLine和String或反之亦然

时间:2014-02-12 09:18:45

标签: c#

马上开球:

所以我在比较用户是否正在输入正确的答案。 代码看起来像这样:

While(Console.ReadLine()!=RightAnswerFunc())
{
  //Wrong. Retry.
}

private static string RightAnswerFunc()
{
//smth here
}

那么:

之间有什么区别吗?
  • While(Console.ReadLine()!=RightAnswerFunc())
  • While(RightAnswerFunc()!=Console.ReadLine())

直观地说,我会写第一种方式。这似乎合乎逻辑。但是有什么真正的区别吗?或者只是一个惯例? 如果没关系,那么它总是无所谓吗? (即比较Int32时很好,但比较其他类型时则错误。)

4 个答案:

答案 0 :(得分:3)

简短的回答是,对于大多数代码而言,它可能无关紧要。

很长的答案是,根据你在RightAnswerFunc中所做的事情,这很可能很重要。 C#从左到右调整方法,因此首先调用ReadLine(),一旦该方法返回,将调用RightAnswerFunc。如果在这些方法中存在任何副作用,这是很重要的,例如想象:

private static string RightAnswerFunc()
{
    Environment.Exit(0);
    return "Hello World!";
}

调用while (Console.Readline() != RightAnswerFunc()) { }会使您的程序保持打开状态,直到用户点击进入。交换操作数会立即关闭您的应用程序。

对于逻辑&&||运算符来说,这甚至也很重要,它们只计算操作数,直到最终表达式可以被计算为true或false。

例如if (true || SomeMethod())将不会调用该方法,因为结果将始终为true。

答案 1 :(得分:1)

在您的情况下 用于所有单一比较 (无论运营商类型和要比较的类型),它都 很重要。但是,如果要构建逻辑,请考虑

bool A()
{
    return false;
}

bool B()
{
    return true;
}

//...

if (A() && B())
{
    // do something
}

要使AND(&&)子句为true,所有元素必须为true。但是,A()返回false,并且运行时(或者编译器在这里,在优化步骤中,但不要担心...)根本不会评估B()。

OR(||)表达式也是如此。如果子句中的任何元素为true,则从左到右进行求值,则不会执行该子句的其余部分。


注意。此外,如果在Readline()之后没有其他电话,那么您的应用程序可以立即退出。

答案 2 :(得分:1)

它将完全相同,它总是只比较两个字符串的输出。

我可能会做的是更改它,以便比较完全发生在你的RightAnswerFunc中并且它返回了一个bool。 EG:

While(!RightAnswerFunc())
{
    //Wrong. Retry.
}

private static bool RightAnswerFunc()
{
    bool isValid = false;
    if(yourStringValue == Console.ReadLine())
    {
          isValid = true;
    }
    return isValid;
}

答案 3 :(得分:0)

只要你只在一次操作中比较两件事(例如在if子句中只有一个!=),你编写它的方式无关紧要。