代码之家  ›  专栏  ›  技术社区  ›  Anonymous Type

我应该使用一个结构而不是类来保存C中的字符串数据吗?[副本]

  •  5
  • Anonymous Type  · 技术社区  · 15 年前

    这个问题已经有了答案:

    C问题。
    假设我有一个客户类,它有一系列只存储字符串数据的道具,比如姓名、邮政数据和电话号码。

    我不将此实体用于ORM,因为我只是将其添加到某种类型的集合中,以便在应用程序生命周期中使用。 此外,我不需要向它添加任何特定于实体的方法,也不需要将数据持久化到XML或数据库,甚至是Web服务。

    将它设置为结构而不是类是否更好?或者没有好处? 还有一个问题,我应该把收集客户列为一个列表结构吗?

    严厉一点,请批评。:)

     struct customer
        {
            private string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
        }
    
    struct Customers<List>
    {
        private customer cust;
    
        public customer Cust
        {
            get { return cust; }
            set { cust = value; }
        }
    
    }
    
    5 回复  |  直到 11 年前
        1
  •  5
  •   Andrew Cooper    15 年前

    我看不出有什么价值 customer 结构。字符串字段都将是引用类型,因此您也可以将整个对象设置为引用类型(即。 class )

    我倾向于使用一种内置的集合类型,而不是为 Customers . 比如:

    List<Customer> Customers = new List<Customer>();
    
        2
  •  3
  •   Community Mohan Dere    8 年前

    我想你可以看看 When to use struct in C#?

        3
  •  2
  •   Mitch Wheat    15 年前

    除非您确定了使用结构的特定原因,否则请使用类。

    更新:由于@dmitry lobanov:eric lippert的帖子: The Truth About Value Types

    结构与类

    结构可能类似于类, 但是有重要的区别 你应该知道的。第一个 所有类都是引用类型和 结构是值类型。通过使用 结构,您可以创建 表现得像内置类型和 享受他们的福利。

    堆还是堆?

    当你在课堂上给新接线员打电话时, 在堆上分配。但是,当 你实例化了一个结构,它 可以是 在堆栈上创建。这将产生 性能提升。而且,你不会 正在处理对 结构的实例 课程。你将直接工作 结构实例。因为 当将结构传递给 方法,它由值传递 作为参考。

    Ref

        4
  •  1
  •   S.Robins    15 年前

    就其价值而言,我永远不会使用结构,因为我很少需要提供一个没有某种关联行为(验证器、格式化程序等)的仅数据结构。

    关于“结构”的基本概念,我最喜欢的一点是它代表了一个最基本的存储系统,因此应该避免编写所有这些琐碎的自定义getter和setter以及所有这些东西…但是,再一次,我们现在有了这些可爱的自动属性,它们从纯粹的编码角度有效地实现了同样的结果,虽然我体内的Yagni Nazi可能会说使用这个结构是因为它是简单的,但我体内的现实主义者知道我将不可避免地想要改变这个结构。不管怎样,对于一个类来说,为什么不从一开始就简单地实现这个类并完成它呢?;-)

    至于性能和其他好处的争论…问你自己“这真的重要吗?”如果你在写一个严肃的实时系统…也许你想用另一个工具。如果你只是简单地传递一些数据,你可能会有大量的处理Crouton在你的处理,而且你的杀手算法可能不需要担心纳米秒的区别。

        5
  •  0
  •   Trisped    11 年前

    我个人在需要存储信息的任何地方都使用结构,只要它不会导致明显的性能问题。在大多数项目中,这是永远不会发生的,因为数据要么直接映射到现有类型,要么大于引用(影响不变的LINQ查询和其他操作)。我发现只有当我可以将数据粘贴到数组中并保留在数组中(直接修改数组中的变量)、很少使用结构或结构中的数据量小于64位(忽略结构开销)时,结构才可行。

    此外,结构比具有主要差异的类更具限制性:

    • Structs are value types while classes are reference types . 这意味着当分配整个结构实例时,只复制类实例的内存地址,而复制整个结构实例。由于大多数程序都是32位或64位的,因此通常建议限制结构的大小,以防止与复制结构实例相比的性能问题。虽然这可以通过将结构放入数组来克服,但这会将结构移动到堆(而不是堆栈)。此外,使用类似的仿制药 List 始终返回实例的副本,因为它们使用方法访问值。另请参见 结构实例与类实例 中的节 Objects (C# Programming Guide)
    • Structs can be instantiated on the stack ,而类总是在堆上实例化。这是由编译器控制的,不影响编码,尽管它可能有一个小的性能优势(很少被检测到)。
    • 在结构声明中,除非字段声明为const或static,否则无法初始化字段。
    • 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
    • 与类不同,结构可以在不使用新运算符的情况下实例化。
    • 结构不能从另一个结构或类继承,也不能是类的基。
    • 所有结构直接继承System.ValueType,后者继承System.Object,而类继承System.Object。
    • 结构不能为空(使用泛型 Nullable 结构)。