【问题标题】:Using nullable types in C#在 C# 中使用可为空的类型
【发布时间】:2008-11-03 18:19:07
【问题描述】:

我只是对人们的意见感兴趣。在 C# 中使用可空类型时,测试 null 的最佳实践方法是什么:

bool isNull = (i == null);

bool isNull = !i.HasValue;

当分配给非空类型时也是这样的:

long? i = 1;
long j = (long)i;

优于:

long? i = 1;
long j = i.Value;

【问题讨论】:

    标签: c# nullable


    【解决方案1】:

    我会用这个:

    long? i = 1;
    ...some code...
    long j = i ?? 0;
    

    这意味着,如果 inull,则分配为 0。

    【讨论】:

    • 另外,如果您要为该值类型分配默认值(可能为 0,也可能不是 0),您可以使用 long j = i ??默认(长);
    • 我对 trhat 表单的问题是并非所有开发人员都会立即知道发生了什么。
    • 非常酷 - 我还没有发现 ??运算符或“默认值”。
    • @Ed Swangren,专业的 .net 程序员应该知道空合并运算符是什么。就像我希望 C 开发人员了解位移运算符一样。不要按照没有学过的程序员的最低标准编写代码。
    • 通过将 null 转换为 0 你实际上隐藏了一个异常。这可能是合适的,这取决于您是否可以假设默认值。另外你是否应该使用 ??运算符并不是我的问题的一部分。
    【解决方案2】:

    使用 C# 团队专门为您实现的表单。如果有人反对,告诉他们安德斯说没关系。

    我的意思是,轻率地说,将可空类型集成到 c# 中为您提供了良好的编程体验。

    请注意,在性能方面,两种形式都编译为相同的 IL,即:

    int? i = 1;
    bool isINull = i == null;
    int j = (int)i;
    

    在 C# 编译器处理完之后会这样结束:

    int? i = 1;
    bool isINull = !i.HasValue;
    int j = i.Value;
    

    【讨论】:

      【解决方案3】:

      我总是使用 (i==null) 形式。它表达了你在做什么。

      WRT第二个问题,我认为任何一种形式都可以。但是,我总是先检查它是否为 null 并采取适当的措施——也许将检查和操作包装在一个辅助方法中(通常它只是设置一个默认值)。

      【讨论】:

        【解决方案4】:

        在实践中我没有使用过 Nullable 类型,但是对于第二个,我实际上建议使用 j.GetValueOrDefault()。文档表明,后者实际上会在出现空值时抛出 InvalidOperationException。根据显式转换运算符的内部实现 long? ,前者也可能。我会坚持使用 GetValueOrDefault 并适当地处理 null/default 情况。

        【讨论】:

          【解决方案5】:

          我倾向于在两者上都使用第一个,因为它需要在其生命周期的后期得到支持,这些似乎更容易理解原作者的意图。

          【讨论】:

            【解决方案6】:

            打开了反射器。 HasValue 是对值更改时设置的布尔标志的查找。因此,就周期而言,查找会比比较更快。

            public Nullable(T value)
            {
                this.value = value;
                this.hasValue = true;
            }
            
            private bool hasValue;
            
            internal T value;
            
            public bool HasValue
            {
                get
                {
                    return this.hasValue;
                }
            }
            

            【讨论】:

            • 您是否检查过比较结果?如果语法糖最终不是对 HasValue 的调用,我会感到惊讶。
            【解决方案7】:

            它们都是相同的,但我会在两者上使用前一个版本,因为它在语言中更常见:与 null 比较并强制转换为类型。

            【讨论】:

              【解决方案8】:

              我通常倾向于在这两种情况下使用第一个选项,因为它更“原始”面向而不是面向对象(这确实是我们想要的),但这真的没那么重要

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-30
                • 1970-01-01
                • 2011-09-15
                • 2011-05-12
                • 2012-04-21
                • 1970-01-01
                • 2014-11-21
                相关资源
                最近更新 更多