C# 访问器方法中的null合并运算符

C# 访问器方法中的null合并运算符,c#,performance,accessor,readability,null-coalescing-operator,C#,Performance,Accessor,Readability,Null Coalescing Operator,我在stackoverflow中查看了在访问器方法中放置null合并运算符是否有任何性能影响 之前: private Uri _Url; public Uri Url { if(_Url == null) _Url = new Uri(Utilities.GenerateUri()); return _Url; } 之后: private Uri _Url; public Uri Url { get { return _Url

我在stackoverflow中查看了在访问器方法中放置null合并运算符是否有任何性能影响

之前:

private Uri _Url;
public Uri Url
{
    if(_Url == null)
        _Url = new Uri(Utilities.GenerateUri());
    return _Url;
}
之后:

private Uri _Url;
public Uri Url 
{
    get 
    {
        return _Url = _Url ?? new Uri(Utilities.GenerateUri());
    }
}
我甚至不确定语法是否正确,但在调试时,会设置私有对象

在有人问这样做有什么意义之前,我们在内部争论是为了可读性而写,还是为了性能而写


我不知道编译器是否会优化??总比手动空值检查好。微优化不好,但我只是好奇

你实际上可以这样写:

return _Url ?? (_Url = new Uri(Utilities.GenerateUri()));

就性能而言,它实际上与使用if是一样的,因此没有区别。

我很确定这两种方法产生[几乎]相同的IL。不幸的是,我的环境没有给我检查的可能性。作为一项规则,除非性能至关重要,否则一定要追求可读性。你更喜欢的纯粹基于意见的问题选择版本。如果您认为有任何绩效影响,请测量或查看IL。我希望几乎没有差别。。。但不会对任何结果下注。。。一个额外的任务不太可能造成任何可测量的影响。你的语法看起来确实很整洁succinct@LeeGary这一行比你的好,但是。。。你真的想要吗?如果非C开发人员要使用您的代码呢?我曾经使用非常特定于语言的东西,但当我离开我的第一份工作时,在第一个月里,我每天花1-2个小时解释这个或那个操作员对那个公司的新开发人员做了什么。从那时起,我只在这些功能真正给了我一些重要的东西时才使用它们。然而,这可能导致公开讨论。@Leri-hmm,我不同意不使用特定于语言的东西,我更倾向于利用语言提供的东西。就像关于在.net中使用var的争论一样,它让一些人觉得它使代码看起来非常javascripty,但实际上它提高了生产率。@Leri我认为作者总结了我的观点。谷歌试图让这个库更加java化friendly@LeeGary说到var关键字,只有当类型清楚地写在语句的右侧时,才应该真正使用它。我很确定msdn上有一些关于这方面的参考资料。