我在一个不了解数据绑定的地方工作。我已经用了大约一年的时间了,我想弄清楚到底是怎么回事。
特别是,我想知道以下两种类型的呼叫之间是否有什么区别。
考虑到这个简单的数据示例:
public class TableType {
public int ID;
}
public System.Data.Linq.Table<TableType> TableTypes
{
get
{
return this.GetTable<TableType>();
}
}private BindingList<TableType> _tableTypeList;
public BindingList<TableType> TableTypesList1
{
get
{
if (_tableTypeList == null)
{
var temp = TableTypes.OrderBy(t => t.ID);
_tableTypeList = ((IListSource)temp).GetList() as BindingList<TableType>;
}
return _tableTypeList;
}
}这里的高级开发人员使用版本1编写了大量数据库代码。
从这个角度来看,您可能会认为它会防止冗余的数据库调用,但情况似乎并非如此。代码上的断点再也不会被击中。
public BindingList<TableType> TableTypesList2
{
get
{
var query = from t in TableTypes orderby t.ID select t;
var result = new BindingList<TableType>(query.ToList());
return result;
}
}高级开发人员大约6个月前离开了,所以现在我正在编写数据库调用。
我一直在使用版本2,在我看来,它看起来要干净得多,而且看起来也是如此。
一个版本比另一个版本好吗?有一个版本没有其他版本吗?我怎么才能对发生的事情有更好的感觉呢?
特别是,我惊讶地发现,对TableTypesList1的另一个调用并没有调用getter。
发布于 2017-05-05 06:19:07
一个版本比另一个版本好吗?
这取决于你到底想要什么。
一个人不能说该选哪一个。你必须知道什么对你更好。
有一个版本没有其他版本吗?
是。V1每次只获取一次数据,每次只获取一次V2。这意味着让第一个属性成为属性可能是可以接受的,因为随后的调用将是快速的,并且只有第一次初始化可能需要一些时间(取决于它需要获取多少数据)。它返回的值存储在备份字段中,并且每个字段都返回相同的值。
另一个头上的第二个解决方案显然像一个方法,因为它可以在每个调用中返回不同的列表,因此我将使V2成为一个方法。
我怎么才能对发生的事情有更好的感觉呢?
这个if就是答案:
如果(_tableTypeList == null) { var temp = TableTypes.OrderBy(t => t.ID);_tableTypeList = ((IListSource)temp).GetList()作为BindingList;}
我惊讶地发现,对TableTypesList1的另一个电话并没有调用getter。
可能是这样的,但是当您将断点放入if中时,显然不会再次调用这个块。
https://codereview.stackexchange.com/questions/162545
复制相似问题