【发布时间】:2011-08-10 23:39:29
【问题描述】:
在我的项目中,我有一个头类,它代表系统内部一条信息的全局唯一键,例如它属于谁,它存在的时间等。在同一个头类中,我也有字段特定于给定数据实例的信息,例如谁创建了此版本的信息、创建时间、是否需要将新数据保存到数据库等。
这是一个将一些信息存储到数据传输类中并查询回来的示例。
var header = new IntvlDataHeader(
datapoint: Guid.NewGuid(),
element: Guid.NewGuid(),
intervalUtc: DateTime.Now.Date);
package.StockData_Decimal(header, 5m);
decimal cloneData;
package.TryGetData_Decimal(ref header, out cloneData);
// header now refers to a different object, that could have different flags/information
请注意我是如何让 TryGetData_Decimal 通过引用传递标头变量的。 IntvlDataHeader 是一个类,如果在 TryGetData 中找到数据,则将引用更改为指向 IntvlDataHeader 的新实例,该实例除了具有相同的唯一键信息外,还具有特定的实例信息。
是否将键与实例特定信息相结合并使用 ref 参数作为 in 和 out 的糟糕设计?拆分另一个类以便有两个 out 参数并且没有 ref 参数会更好还是避免任何潜在问题?
方法的签名是public bool TryGetData_Decimal(ref IntvlDataHeader header, out decimal data)
【问题讨论】:
-
哇,
TryGetData_Decimal真是太可怕了。为什么不使用泛型并使用类似于TryGetData<decimal>的东西? -
由于几个原因,底层系统仅支持 5 种预定数据类型。我本来可以只使用 TryGetData,但是会有 15 个重载,从智能感知方式来看,只有 3 个名称中的类型的重载似乎更清晰。还有必须运行的类型特定代码,对于 String 和 Guid 数据类型,系统使用基于字典的压缩,它不用于其他类型。因此,使用泛型方法将需要另一个级别的间接性。在公共调用 *_Decimal 之后,有通用的私有方法在内部处理调用
-
酷,很高兴知道这是故意的决定。感谢您告知我们。
标签: c# .net design-patterns architecture