C#运算符和可读性

Ler*_*ins 5 c# compiler-construction operators

我只是在处理一些代码并发现自己犯了这个错误

if (stringName == "firstName" || "lastName")
   // Do code 
Run Code Online (Sandbox Code Playgroud)

显然这是错误的,应该是

if (stringName == "firstName" || stringName == "lastName")
   // Do code 
Run Code Online (Sandbox Code Playgroud)

但它只是让我思考可读性会更容易吗?也许有一些逻辑可以说除非指定一个新的stringName,否则使用第一个?

真的不是一个问题,我只是好奇,如果有一些我不完全理解编译这样的声明背后的逻辑.

Mic*_*tta 11

我觉得你的建议将浑浊的表达解析的规则 - 现在,"=="变成quadreny运营商,而不是二进制一(?).我发现自己错过了SQL的'IN'运算符,并且使用了类似这样的东西:

if (stringName.In("foo", "bar", "baz"))
{

}

// in an extension method class
public static bool In<T>(this T value, params T[] values)
{
    return values.Contains(value);
}
Run Code Online (Sandbox Code Playgroud)


Pow*_*ord 10

问题是如果对布尔有效.

stringName == "firstName"返回一个布尔值.
"lastName"是一个字符串文字.

|| 是一个短路的布尔值或运算符,两侧都有布尔值.

换句话说,你想改变其定义||通常是一个坏主意.

从理论上讲,你可以让解析器推断出你的意思......但这很快就会变得含糊不清.

if (stringName == firstName || lastName)
Run Code Online (Sandbox Code Playgroud)

看起来不错吧?但究竟什么是lastName?

如果我这样做怎么办?

const bool lastName = false;
Run Code Online (Sandbox Code Playgroud)

而且,与上述逻辑&&相反||,但stringName == firstName && lastName并不相反,事实上也没有意义.


tva*_*son 6

当代码明显错误以便修复它时编译器猜测程序员的意图是一个非常非常糟糕的主意.