我个人是三元运算符的拥护者:()?:; 我确实意识到它有它的位置,但我遇到了许多完全反对使用它的程序员,而且有些人经常使用它.
你有什么感受?你看到了什么有趣的代码?
假设您正在使用三元运算符或空合并运算符或嵌套的if-else语句来选择对象的赋值.现在假设在条件语句中,您对昂贵或易失性操作进行了评估,要求将结果放入临时变量中,捕获其状态,以便可以对其进行比较,然后进行可能的分配.
一个语言(如C#)如何实现一个新的逻辑运算符来处理这种情况?应该是?在C#中是否存在处理此案例的现有方法?其他语言?
例如,当我们假设我们正在寻找直接比较时,已经克服了一些降低三元或零合并算子的冗长度的情况.请参阅使用Null Coalescing运算符的唯一方法,特别是关于如何扩展运算符的使用以支持的讨论String.IsNullOrEmpty(string).注意Jon Skeet如何使用PartialComparerfrom MiscUtil,将0s 重新格式化为nulls,
为什么这可能是必要的?那么,看看我们如何为没有任何快捷方式的复杂对象编写比较方法(引用的讨论中的示例):
public static int Compare( Person p1, Person p2 )
{
return ( (result = Compare( p1.Age, p2.Age )) != 0 ) ? result
: ( (result = Compare( p1.Name, p2.Name )) != 0 ) ? result
: Compare( p1.Salary, p2.Salary );
}
Run Code Online (Sandbox Code Playgroud)
Jon Skeet写了一个新的比较来回避平等案例.这允许通过编写一个返回null的新特定方法来扩展表达式,允许我们使用null合并运算符:
return PartialComparer.Compare(p1.Age, p2.Age)
?? PartialComparer.Compare(p1.Name, p2.Name)
?? PartialComparer.Compare(p1.Salary, p2.Salary)
?? 0;
Run Code Online (Sandbox Code Playgroud)
空合并运算符更具可读性,因为它有两个边,而不是三个边.布尔条件子句分为一个方法,在这种情况下返回null表达式必须继续.
如果我们可以更容易地将条件置于线上,那么上面的表达式会是什么样的?获取 …
我想下面的方法调用链.
void DoSomething()
{
ObjectA a = CreateA();
if (a != null)
{
a.Foo();
}
}
ObjectA CreateA()
{
ObjectB b = CreateB();
if (b != null)
{
ObjectA a = b.ToA();
return a;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果方法调用深度变深,则空检查将更加重叠.对此有什么好的解决方案吗?
改性
我改变了示例代码.它无法解决我将CreateA更改为构造函数的问题.问题是只有不必要的空检查链接重叠.
void SetImage()
{
UISprite image = GetSprite();
if (image != null)
{
image.spriteName = "hat";
}
}
UISprite GetSprite()
{
UISprite image = GetComponent<UISprite>();
if (image != null)
{
image.width = 100;
image.height = 100;
return image;
}
return …Run Code Online (Sandbox Code Playgroud) 是否有更高效,可读或更现代的方式来编写以下内容?
let currentColor:UIColor = view.backgroundColor != nil
? view.backgroundColor! // forced unwrapping
: UIColor.whiteColor() // fallback value
Run Code Online (Sandbox Code Playgroud)
我不介意在这里使用三元运算符,但感觉我应该使用Swift if let currentColor = view.backgroundColor语法.我只是不确定如何指定默认值.