gpt4 book ai didi

c# - 使用 ref 改变部分不可变类的方法设计

转载 作者:行者123 更新时间:2023-11-30 12:34:35 25 4
gpt4 key购买 nike

在我的项目中,我有一个 header 类,它表示系统内部一条信息的全局唯一键,例如它属于谁,它存在的时间等。在同一个标​​头类中,我还有字段对于特定于给定数据实例的信息,例如谁创建了此版本的信息、创建时间、是否需要将其新数据保存到数据库等。

下面是一个将一些信息存入数据传输类并查询回来的示例。

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 通过引用传递 header 变量的。 IntvlDataHeader 是一个类,如果在 TryGetData 中找到数据,则引用将更改为指向 IntvlDataHeader 的新实例,该实例除了具有相同的唯一 key 信息外,还具有特定的实例信息。

将键与实例特定信息组合在一起并使用 ref 参数是否是一个糟糕的设计?拆分出另一个类以便有两个 out 参数而没有 ref 参数的努力是否会更好或避免任何潜在问题?

方法的签名是public bool TryGetData_Decimal(ref IntvlDataHeader header, out decimal data)

最佳答案

我认为您的 TryGetData_Decimal 的命名具有误导性,如果您传入的 ref 参数将在方法退出时指向一个新实例。 TryGetData_Decimal,对我来说,听起来像是一些值类型的 TryParse 方法的变体(它有一个包含解析值的输出参数 - 类似于 cloneData 参数)。

我想我不确定为什么标题对象必须指向一个新实例,所以我不确定我可以推荐一个设计。如果那是您需要做的,我认为如果您的 TryGetData_XXX 方法具有类似这样的签名,它可能更具可读性:

IntvlDataHeader ExtractValueAndGetNewInstance_Decimal(IntvlDataHeader header, out decimal cloneData)

header 被传入,但在方法退出时不会改变。该方法返回新实例,您可以在需要时使用它。我不会更改 cloneData - 我认为 out 参数是可以的,只要它们没有被过度使用。

我也会尝试将方法的名称更改为更有意义的名称。

希望对您有所帮助。

关于c# - 使用 ref 改变部分不可变类的方法设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7005131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com