C# 设置可空属性的默认值的首选方法?

C# 设置可空属性的默认值的首选方法?,c#,properties,C#,Properties,我进退两难。(简化的)任务是重新设计以下数据持有者类 class Stuff { public String SomeInfo { get; set; } } 以满足不能返回null的要求。我可以想出两种方法来实现这一目标,经过15分钟的深思熟虑后,我根本无法决定哪一种是首选 建造师的方法 class Stuff { public String SomeInfo { get; set; } public Stuff() { SomeInfo = String.Empty; } }

我进退两难。(简化的)任务是重新设计以下数据持有者类

class Stuff
{
  public String SomeInfo { get; set; }
}
以满足不能返回null的要求。我可以想出两种方法来实现这一目标,经过15分钟的深思熟虑后,我根本无法决定哪一种是首选

建造师的方法

class Stuff
{
  public String SomeInfo { get; set; }
  public Stuff() { SomeInfo = String.Empty; }
}
按属性接近

class Stuff
{
  private String _SomeInfo;
  public String SomeInfo 
  { 
    get { return _SomeInfo ?? String.Empty; }
    set { _SomeInfo = value; }
  }
}

请注意,如果有任何意义的话,可以使用构造函数和初始化来创建Stuff实例。据我所知,不会有任何其他限制(但您知道客户的规格并不总是反映实际情况)。

您只能确保在使用该属性时不会返回
null

class Stuff
{
  private String _SomeInfo;
  public String SomeInfo 
  { 
    get { return _SomeInfo ?? String.Empty; }
    set { _SomeInfo = value; }
  }
}
文本控件(例如在ASP.NET中)使用相同的方法,
text
属性从不返回
null
,而是返回
String.Empty

例如():


您还可以在setter而不是getter中实现逻辑,这样您的back字段总是有一个有效值

class Stuff
{
  private String _SomeInfo = string.Empty;
  public String SomeInfo 
  { 
    get { return _SomeInfo; }
    set 
    { 
      if (value != null)
      {
        _SomeInfo = value; 
      }
    }
  }
}

只需添加另一个答案,您还可以在单个语句中为string对象设置默认值

class Stuff
{
  private String Something {get; set;} = string.Empty;
}

嗯-您的第一个选项不符合您的要求-因为我仍然可以将属性设置为null#2是您唯一真正的选择。如果初始化是指某种形式的反序列化,请注意某些实现不会执行构造函数代码。#2的另一个次要特点可能是在设置值时而不是在检索时验证输入。如果您发现经常检索
null/Empty
值,那么最好在设置为空时进行一次/很少检查。编辑:请注意,这假设您足够警惕,不会将支持字段设置为null。您可能希望更新
if
检查以设置
字符串。清空
,而不是什么都不做。例如:
myStuff.SomeInfo=“你好!”;myStuff.SomeInfo=null;Console.WriteLine(myStuff.SomeInfo)//你好编辑:可能简单到
\u someInfo=value??字符串。空
@ChrisSinclair我认为这真的取决于OP。如果出现错误,也可以决定抛出异常…+1我同意有几个选项。我之所以建议它,是因为赋值
String.Empty
将与OP现在演示的行为一致。@vc74我认为它在开始时,在赋值之前是空的,不是吗。当然,我理解你的观点,我认为这是正确的。然而,我相信它仍然需要在二传手和接球手上都有一个保护者。既然getter本身就足够了,那么基于setter的保护器就变得多余了,不是吗?没有在代码中尝试过-我只是在这里计算。@KonradViltersten它不会为null,它被初始化为emptyI不为meIt编译,仅当模型中的参数不是必需的且未发送时才有效。当参数在正文中发送且值为空时,它不起作用。这非常有效-谢谢
class Stuff
{
  private String Something {get; set;} = string.Empty;
}