如何最好地设计可能包含null对象的类

时间:2015-08-13 11:22:43

标签: c#

我打算设计一个更经常不包含对Null值的引用的类。它让我想起了可空的Datetime,它有一个布尔值来表明是否存有实际值。

        DateTime? dt = new DateTime?();
        if(dt.HasValue)
        {
            //DoStuff
        }

如下设计课程是一种很好的编码实践吗?

class Computer
{
    public string Name;
    public string ID;
    //...
    public bool IsHiveMind;
    public HiveMindInfo RegInfo;
}
class HiveMindInfo
{
    string SecretLocation;
    int BaudRate;
    int Port;
}

......并使用它......

Computer aComputer = GetComputer(...);
if(aComputer.IsHiveMind)
{
    Network.DoHostileTakeOver(aComputer); //!
}

3 个答案:

答案 0 :(得分:1)

下面这段代码怎么样? 看来你可以删除IsHiveMind变量,因为HiveMindInfo变量通过检查它的null是否具有相同的含义。

  class Computer
  {
    public string Name;
    public string ID;

    public HiveMindInfo RegInfo;
  }

  class HiveMindInfo
  {
    string SecretLocation;
    int BaudRate;
    int Port;
  }

  Computer aComputer = GetComputer(...);

  if (aComputer != null && aComputer.RegInfo != null)
  {
    Network.DoHostileTakeOver(aComputer);
  }

答案 1 :(得分:1)

要回答您的问题,您可以按照建议实施代码。

另一种方法是考虑以下设计模式:

示例代码

    interface ITakeOverStrategy
    {
       void Execute();
    }

    class KevinFlynnHackerStrategy : ITakeOverStrategy
    {
        public void Execute()
        {
            // a nod to Tron
        }
    }

    class NeoHackerStrategy: ITakeOverStrategy
    {
        private readonly HiveMindInfo _hiveMindInfo;

        public NeoHackerStrategy(HiveMindInfo info)
        {
           _hiveMindInfo = info;
        }
        public void Execute()
        {
            // Mr. Anderson!
        }
    }

    // This is a surrogate class.
    // ... The value returned by String.Empty is often used as a surrogate.
    class IdleStrategy : ITakeOverStrategy
    {
        public void Execute()
        {
            // do nothing
        }
    }

    class Computer
    {
        private readonly ITakeOverStrategy _takeoverStrategy ;

        public Computer(ITakeOverStrategy strategy)
        {
            _takeoverStrategy = strategy;
        }

        public Subjugate()
        {
            // insert epic code here
            _takeoverStrategy.Execute();
        }
     }

然后在代码中的某处,使用适当的策略创建Computer的实例:

var info = new HiveMindInfo();
// update instance parameters

var computer = new Computer(new NeoHackerStrategy(info));
computer.Subjugate();

更新

2015年8月13日,美国东部时间10:13

我对结构的评论不在原始问题的范围内,并且已被删除:

如果您的类只包含字段 / 属性,那么我会考虑将它们转换为struct。

答案 2 :(得分:-2)

只需添加?对你的对象:

class Computer
{
    public string Name;
    public string ID;
    //...
    public HiveMindInfo? RegInfo;
}
struct HiveMindInfo
{
    string SecretLocation;
    int BaudRate;
    int Port;
}

然后完全按照日期时间检查它:

Computer aComputer = GetComputer(...);
if (aComputer.RegInfo.HasValue)
{ 
     // Do something 
}