马上开球:
所以我在比较用户是否正在输入正确的答案。 代码看起来像这样:
While(Console.ReadLine()!=RightAnswerFunc())
{
//Wrong. Retry.
}
private static string RightAnswerFunc()
{
//smth here
}
那么:
之间有什么区别吗?While(Console.ReadLine()!=RightAnswerFunc())
While(RightAnswerFunc()!=Console.ReadLine())
直观地说,我会写第一种方式。这似乎合乎逻辑。但是有什么真正的区别吗?或者只是一个惯例? 如果没关系,那么它总是无所谓吗? (即比较Int32时很好,但比较其他类型时则错误。)
答案 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子句中只有一个!=),你编写它的方式无关紧要。