【问题标题】:Function to check a null string property?检查空字符串属性的函数?
【发布时间】:2011-12-11 06:22:26
【问题描述】:

我有一个具有string 属性的对象,例如,具有体重和高度的患者对象。

但是当属性为空时,当我尝试使用它时我的代码会失败,因为属性设置为空。我正在尝试创建一个函数来检查字符串/属性是否为空,如果是,请将属性设置为""

我知道我可以做到:

if(string.isNullOrEmpty(patient.weight)) patient.weight = "";

但我需要代码尽可能干净,而且我有很多属性,所以我不想手动检查每一个。理想情况下,我希望有一个可以获取字符串的函数(即使它为空也不会失败),并且如果它不为空,则只需返回值,如果为空,则返回 ""

谁能告诉我这方面的线索?

【问题讨论】:

  • 在创建对象时,您不能只将字符串初始化为“”吗?

标签: c# properties null-coalescing


【解决方案1】:

就我个人而言,我会确保这些属性永远可以这样写:

private string _Name = string.Empty;
public string Name
{
    get
    {
        return _Name;
    }
    set
    {
        _Name = value ?? string.Empty;
    }
}

不过,您要查找的可能是?? 运算符,也称为null-coalescing operator,如上所用,基本上就是这个表达式:

x = y ?? z;

意思和这个一样:

if (y != null)
    x = y;
else
    x = z;

这也不完全正确。在上面的示例中,y 被计算了两次,而 ?? 运算符不会发生这种情况,因此更好的近似值是:

var temp = y;
if (temp != null)
    x = temp;
else
    x = z;

【讨论】:

  • 嗯,有人看到(编辑我的问题并检查源代码)为什么我的代码最终被格式化了吗? IE。该属性像这样组合在一行上。
  • 通过在大括号 {} 之前不插入 EOL 来修复它。
  • 虽然这可能不会将它组合在一条线上,但这几乎不是一个解决办法。今天代码markdown处理有bug吗?
  • 通常当这种情况发生在我身上时,我只是重新选择所有内容,然后再次使用代码格式将其包装起来,然后它就会修复它。我在 Leito 的编辑之前这样做了,但随后我的互联网中断了几秒钟:(。工作连接......
  • 不,Stack Overflow 消失了几秒钟,我也发生过。
【解决方案2】:

null coalescing operator 听起来像是你的朋友:

string text = patient.Name ?? "";

可以写一个扩展方法来做同样的事情,但我认为操作符最终可能会变得更具可读性。

请注意,这不会 设置 属性 - 但这不是你所说的你想要的,在句子中:

理想情况下,我希望有一个可以获取字符串的函数(即使它为空也不会失败),并简单地返回值(如果它不为空),或者如果它为空则返回“” .

这正是上面的代码所做的。

【讨论】:

    【解决方案3】:

    这样的?

    public string EmptyIfNull(string value) 
    {
        return value ?? String.Empty;
    }
    

    【讨论】:

      【解决方案4】:

      使用空合并运算符:

      string s = Patient.Name ?? string.Empty;
      

      所以如果Patient.Name 为空,那么s 将被设置为空字符串。

      【讨论】:

        【解决方案5】:

        你可以做myString ?? string.Empty,它给你字符串,或者如果它为null,则为string.Empty。

        【讨论】:

          【解决方案6】:

          当任何对象为空时,您可以使用?? operator 返回您选择的默认值。

          string a = null;
          a = a ?? "womble";
          // a now has the value "womble"
          
          string b = "fluff";
          b = b ?? "cabbage";
          // b wasn't null, so it still has the value "fluff"
          

          【讨论】:

            【解决方案7】:

            我不确定您要问的是最适合您的解决方案。如果每次您不想检查String 并返回"" 如果它是null,我建议您将String 字段初始化为""

            private String height = "";
            

            而不是

            private String height;
            

            顺便说一句,您应该将heightweight 之类的值存储为Double 而不是String,除非您有充分的理由不这样做。

            【讨论】:

              【解决方案8】:

              【讨论】:

                【解决方案9】:

                如果 WeightHeight 是整数,则它们不能为空。如果您的对象是 null 并且您试图获取 null 对象的 WeightHeight,那么您的代码就是错误的。如果一个字符串为空,那么它将打印一个空字符。

                下面的很优雅:

                if ( String.isNullOrEmpty(patient.weight) )
                {
                //DO STUFF HERE
                }
                else
                {
                //DO OTHER STUFF HERE
                }
                

                请理解,如果 patient 为 null,您甚至不应该出现在这段代码中。

                如果您使用的是 isNullOrEmpty,那么执行以下操作毫无意义。

                patient.weight = "";
                

                作者注

                我想我不明白字符串为 null 会导致问题的原因。关于初始化时将值设置为空字符串的要点当然是有效的。

                【讨论】:

                  【解决方案10】:

                  您可以将@Jon 的想法更进一步,这样您就不必担心使用 ??无处不在:

                  像这样定义你的访问方法:

                  private String m_name = null;
                  public String Name
                  {
                      get { return m_name ?? String.Empty; }
                      set { m_name = value; }
                  }
                  

                  在您访问 Name 属性的任何地方,它都会为您执行 null 合并运算符。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2015-08-15
                    • 2015-03-18
                    • 2015-05-29
                    • 2011-04-01
                    • 2017-11-25
                    • 2018-04-01
                    • 2018-11-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多