1

可能重复:
C#:结构与类

我正在创建一个库,该库相对较小,需要一个数据库,其中包含 MP3 文件的标签。

我知道如果我有固定大小的数据,如整数、双精度数等,最好坚持使用结构......但是在我的情况下,我有包含字符串甚至其他结构的字符串和列表......如果我会去结构,它看起来像这样:

Public Structure STitle
    Dim Title As String
    Dim Path As String
End Structure

Public Structure SAlbum
    Dim Album As String
    Dim Songs As List(Of STitle)
End Structure

Public Structure SArtist
    Dim Artist As String
    Dim Albums As List(Of SAlbum)
End Structure

然后,我会有这样的事情:

Public SongLibrary As New List(Of SArtist)

字符串和列表让我感到困惑,尤其是在速度方面。因为我会搜索很多歌曲,所以我想确保我使用的是最快的。

我也对装箱和拆箱感到困惑。我假设字符串列表仅包含指向“字符串”的指针,并且结构相同(试图低级思考)。但是,我不知道是否会发生装箱拆箱,这会减慢搜索速度(不使用数组列表的原因),因为无法确定大小(或者是吗?)

那么该选哪一个呢?类,还是结构?还是有其他更适合的东西?

4

2 回答 2

7

我知道如果我有固定大小的数据(如整数、双精度数等),最好坚持使用结构

你怎么知道?根据我的经验,创建自定义值类型很少是一个好主意。它确实发生了——例如,我的 Noda Time 项目中有很多——但通常我会保持警惕。在暴露可变结构之前,我也会非常谨慎。

我也对装箱和拆箱感到困惑。我假设字符串列表仅包含指向“字符串”的指针,并且结构相同(试图低级思考)。

对于结构,没有指针(引用)。AList(Of Integer)是用一个Integer()例子来实现的。该数组直接包含值。使用通用集合,不需要装箱。

有关更多信息,请参阅类设计指南,但基本上我会默认使用类,除非我有一个非常令人信服的理由来创建一个结构。

于 2013-01-18T16:46:23.597 回答
2

字符串和列表让我感到困惑,尤其是在速度方面。因为我会搜索很多歌曲,所以我想确保我使用的是最快的

在您的情况下,不清楚字符串和列表之间的关系是什么,但快速搜索通常与数据在您的集合中的分布方式有关。

最快的通常是:对集合进行排序并对其运行二进制搜索。

特别是从快速数据检索的角度来看,不要使用 structs,因为当您从集合中检索数据(如果是结构体)时,数据将被复制到另一个新对象。相反,如果是类,您将获得一个指针(非常有效)。

使用引用类型(类)而不是结构

于 2013-01-18T16:48:25.027 回答