在逻辑上表示单个值时将类转换为结构,类似于原始类型
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 [重复]