我应该公开可空或HasFoo字段吗?

时间:2010-07-09 21:04:55

标签: c#

我正在从XML格式中读取一些数据并将其放入我的类中,我只是想知道关于可以为空的字段的最佳实践是什么,如果它们是空的,则具有默认值。未提供的值不需要写回文件。

我正在考虑使用可空类型,但是,在指定默认值的代码中最好的方法是什么(尽管我不需要每个字段的默认值,因为并非所有字段都具有指定的默认值或默认值是0)

目前我正在使用它:

class SomeElement
{
    public const int DefaultFoo = 123;

    public int? Foo { get; set; }
}

但不知道以下内容是否会更明显:

class SomeElement
{
    // Setting HasFoo to false will set Foo to the default value
    public bool HasFoo { get; set; }
    // Setting Foo to anything will set HasFoo to true
    public int Foo { get; set; }
}

由于某些类具有许多属性,第二个选项将在类中创建更多方法,但是,如果您不关心Foo是否具有值,则可能更容易使用。

最后的替代方法可能是使用基类中的静态方法或扩展方法来使默认更容易获取(基于this的想法)

// In some method using the class
int value = SomeElementBase.GetValueOrDefault(() => myObj.Foo);
// or an extension method
int value = myObj.GetValueOrDefault(x => x.Foo);

我仍然提供DefaultFoo字段,但静态/扩展方法可能更容易访问?

你有什么想法?以前有人遇到过这个问题吗?我应该只使用默认值吗?当保存回文件时省略等于其默认值的字段?

2 个答案:

答案 0 :(得分:8)

我认为可以使用可空字段。没有多余的代码使它们在你的文件中保持同步,意图非常明确,你可以访问Foo.HasValue,这比我在类中单独的HasValue属性更能表达你的意图。

答案 1 :(得分:2)

我会对没有默认值的值使用nullables的组合,并为具有默认值的值覆盖默认的getter(假设您实际上不需要知道值是否值你得到的是默认的):

class SomeElement {
   public int? NoDefault {
      get; set;
   }

   private int? m_hasDefault;
   public int? HasDefault {
      set { m_hasDefault = value; }
      get {
         if(m_hasDefault.HasValue)
            return m_hasDefault;
         else
            return WhateverTheDefaultShouldBe;
      }
   }
}

在两种情况下仍然返回nullables以保持一致,并隐藏具有默认值的属性与不调用代码的属性之间的任何差异(这样您可以轻松地更改哪些值具有默认值或不具有默认值class,不影响使用该类的代码。)