我打算设计一个更经常不包含对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); //!
}
答案 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();
我对结构的评论不在原始问题的范围内,并且已被删除:
如果您的类只包含字段 / 属性,那么我会考虑将它们转换为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
}