WEB开发网
开发学院软件开发C语言 Effective C# 原则45:选择强异常来保护程序 阅读

Effective C# 原则45:选择强异常来保护程序

 2009-02-19 08:17:27 来源:WEB开发网   
核心提示: private DataSet _data;public IListSource MyCollection{get{return _data;}}public void UpdateData( ){// make the defensive copy:DataSet tmp = _data

private DataSet _data;
public IListSource MyCollection
{
 get
 {
  return _data;
 }
}
public void UpdateData( )
{
 // make the defensive copy:
 DataSet tmp = _data.Clone( ) as DataSet;
 using ( SqlConnection myConnection =
  new SqlConnection( connString ))
 {
  myConnection.Open();
  SqlDataAdapter ad = new SqlDataAdapter( commandString,
   myConnection );
  // Store data in the copy
  ad.Fill( tmp );
  // it worked, make the swap:
  _data = tmp;
 }
}

这看上去很不错,使用了被动式的拷贝机制。你创建了一个DataSet的拷贝,然后你就从数据库里攫取数据来填充临时的DataSet。最后,把临时存储交换回来。这看上去很好,如果在取回数据中发生了任何错误,你就相当于没有做任何修改。

这只有一个问题:它不工作。MyCollection属性返回的是一个对_data对象的引用(参见原则23)。所有的类的使用客户,在你调用了UpdateData后,还是保持着原原来数据的引用。他们所看到的是旧数据的视图。交换的伎俩在引用类型上不工作,它只能在值类型上工作。因为这是一个常用的操作,对于DataSets有一个特殊的修改方法:使用Merge 方法:

private DataSet _data;
public IListSource MyCollection
{
 get
 {
  return _data;
 }
}
public void UpdateData( )
{
 // make the defensive copy:
 DataSet tmp = new DataSet( );
 using ( SqlConnection myConnection =
  new SqlConnection( connString ))
 {
  myConnection.Open();
  SqlDataAdapter ad = new SqlDataAdapter( commandString,
   myConnection);
  ad.Fill( tmp );
  // it worked, merge:
  _data.Merge( tmp );
 }
}

上一页  1 2 3 4  下一页

Tags:Effective 原则 选择

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接