Max*_*mus 1 c# java null design-patterns
我一直在读,null对象模式将帮助您避免空检查和空指针异常,使您的代码更清晰.
我从未使用它,我发现它很有趣."null"不会占用内存,但如果我开始用"默认"对象创建替换我的空检查,这个程序会长期对内存产生负面影响吗?
例如:
空对象模式
public void DoSomething()
{
User user = this.GetUser(id);
string strDisplayName = user.DisplayName;
}
public User GetUser(int id)
{
User user = this.LoadUserFromDB(id);
if(user == null)
return User.CreateNull();
return user;
}
Run Code Online (Sandbox Code Playgroud)
因此,一旦我离开方法的范围,GC将在以后收集该对象.但是如果我在走出范围之前经过一个循环怎么办?
public void DoSomething()
{
users = this.GetAllUsers();
foreach(User user in users)
{
string strAddress = user.Address.StreetName;
//continue tasks
}
}
Run Code Online (Sandbox Code Playgroud)
同时在其他课堂上
public Class User
{
public Address Address
{
get
{
if(this.Address == null)
this.Address = Address.CreateNull();
return this.Address;
}
}
}
public class Address
{
private string streetName;
public virtual string StreetName
{
get { return this.streetName; }
set { this.streetName = value; }
}
public static CreateNull()
{
return new NullAddress();
}
}
public class NullAddress : Address
{
public override string StreetName
{
get { retun String.Empty; }
}
}
Run Code Online (Sandbox Code Playgroud)
空检查
User user = this.GetUser(id);
string strDisplayName = String.Empty;
if(user != null)
{
strDisplayName = user.DisplayName;
}
Run Code Online (Sandbox Code Playgroud)
只需检查用户是否为空,因此请指定属性值.我不会创建一个"null"对象
提前致谢.
通常,空对象不是按需创建的 - 而是共享它们.它们通常是一些其他抽象的不可变实现(使用无操作方法或任何适合的方法) - 因此它们可以非常容易地共享.
在这一点上,你已经有了一个单一的按你感兴趣的,在整个应用生命周期的过程中null对象类型的对象-这是几乎可以肯定微不足道.