使用空合并操作符的独特方法
我知道在C#中使用空合并运算符的标准方式是设置默认值。
string nobody = null;
string somebody = "Bob Saget";
string anybody = "";
anybody = nobody ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"
但还有什么可以??
用于? 它看起来并不像三元操作符那么有用,除了更简洁易读之外,还不如:
nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget
所以,即使知道更少的空合并操作符......
你用过??
为了别的吗?
是??
必要的,或者你应该只使用三元运算符(大多数人都熟悉)
那么,首先,比标准三元链更容易链接:
string anybody = parm1 ?? localDefault ?? globalDefault;
与
string anyboby = (parm1 != null) ? parm1
: ((localDefault != null) ? localDefault
: globalDefault);
如果null可能的对象不是变量,它也可以很好地工作:
string anybody = Parameters["Name"]
?? Settings["Name"]
?? GlobalSetting["Name"];
与
string anybody = (Parameters["Name"] != null ? Parameters["Name"]
: (Settings["Name"] != null) ? Settings["Name"]
: GlobalSetting["Name"];
我用它作为懒惰加载一行:
public MyClass LazyProp
{
get { return lazyField ?? (lazyField = new MyClass()); }
}
可读? 自己决定。
我发现它有两个“有点奇怪”的用法:
TryParse
例程时使用out
参数的替代方法(即,解析失败时返回空值) 后者需要更多的信息。 通常,当您创建一个包含多个元素的比较时,您需要查看比较的第一部分(例如年龄)是否给出明确的答案,然后是仅当第一部分没有帮助时才接下来的部分(例如姓名)。 使用空合并运算符意味着你可以编写非常简单的比较(无论是排序还是相等)。 例如,在MiscUtil中使用几个辅助类:
public int Compare(Person p1, Person p2)
{
return PartialComparer.Compare(p1.Age, p2.Age)
?? PartialComparer.Compare(p1.Name, p2.Name)
?? PartialComparer.Compare(p1.Salary, p2.Salary)
?? 0;
}
无可否认,我现在在MiscUtil中有了ProjectionComparer,以及一些扩展,这使得这种事情更容易 - 但它仍然很整洁。
在实现Equals之前,检查引用相等(或无效)也是可以做到的。
链接地址: http://www.djcxy.com/p/57969.html