在逻辑上表示单个值时将类转换为结构,类似于原始类型

Posted

技术标签:

【中文标题】在逻辑上表示单个值时将类转换为结构,类似于原始类型【英文标题】:Converting a class to struct when logically represents a single value, similar to primitive types 【发布时间】:2021-08-14 18:40:56 【问题描述】:

我不是 100% 确定,但我有一个类看起来像是转换为 struct 的好选择。但是,我不确定下面的要点是否有充分的理由。它说single value,但我有三个属性,所以我不确定这是否是它所说的。该类是转换为struct 的好选择吗?它不是通过引用传递并通过JSON.NET 序列化到客户端作为JSON

It logically represents a single value, similar to primitive types (int, double, etc.).

public class ScheduleVenueTravelTimeModel

        [JsonIgnore]
        public int VenueLocationId  get; set; 
        public int Time  get; set; 
        public int VenueId  get; set; 

【问题讨论】:

一个“值”可以是复合的,但是;我不会太担心那个;我会更关心它如何与你的序列化程序一起工作,以及它是可变的(大多数struct 类型现在应该是readonly struct 我不会转换它,因为JsonIgnore 属性违背了要点的前提。如果它表示单个值,则必须使用所有三个字段,并且该属性在序列化时忽略 VenueLocationId 为什么JsonIgnore 反对它?出于大小原因,这只是不会将属性发送给客户端。 @Mike 如果这将被视为单个值,那么序列化版本应该反映这一点。省略VenueLocationId 意味着反序列化它会产生不同的值。 我会使用单独的 DTO 进行序列化 - 看起来您正在尝试使用相同的数据类型进行序列化和业务逻辑。在这种情况下(如果您的目标构建支持它)我会使用public record ScheduleVenueTravelTimeDto(int Time, int VenueId); 【参考方案1】:

它说的是单值,但我有三个属性,所以我不确定它是否在谈论它

“单个值”是指对象所代表的内容。不是属性的数量。一个典型的例子是一个点。它可能有 X 和 Y 坐标,但它在概念上是一个单一的值。很难判断这是否适用于您的示例,因为我们不知道它是如何使用的。

结构的一点是它们使用值语义。 IE。当传递或返回到方法时,它被复制。为了避免由于副本导致的意外行为,通常建议将结构设为只读,即不可变。有关详细信息,请参阅why mutable structs are evil。供参考,这里是programming guide regarding class vs struct。

另一个考虑因素是您将拥有多少个对象。对于可能有数千甚至数百万个点的列表的点之类的事情,减少 GC 必须跟踪的对象数量可能会很好。但对于数百甚至数千个对象来说,这可能并不重要。

【讨论】:

以上是关于在逻辑上表示单个值时将类转换为结构,类似于原始类型的主要内容,如果未能解决你的问题,请参考以下文章

将 0 和 1 (float64) 转换为布尔值时将空值转换为 True [重复]

在实例化时将类转换为子类

导出到 excel 时将类“pandas.tslib.Timedelta”转换为字符串

语义上表示泛型

语法—函数声明

在 iPad 上表示树结构的最佳方式