3

官方指南表明,这些的实际用途可能很少。有没有人有他们充分利用它们的例子?

4

8 回答 8

1

Au Contrare... 你会发现 C/C++ 人涌向结构,也就是值类型。
一个例子是数据包。如果您有大量数据包要传输/传输,您将使用值结构对数据包进行建模。原因:除了实例数据之外,
将某些东西变成一个类会在对象头中增加一个开销(我忘记了大约 8-16 字节)开销。在不可接受的情况下,值类型是您最安全的选择
另一种用途是您需要值类型语义的情况- 一旦您创建初始化一个对象,它就是只读/不可变的,并且可以传递给 n 个客户端。

于 2008-09-01T13:43:57.343 回答
1

在大多数情况下,模拟框架的行为是件好事。许多基本数据类型(例如ints)都是值类型。如果您有具有相似属性的类型,请使用值类型。例如,在编写Complex数据类型或 aBigInteger时,值类型是合乎逻辑的解决方案。框架使用值类型的其他情况也是如此:DateTime,Point等。

如有疑问,请改用引用类型。

于 2008-09-01T14:00:14.763 回答
0

枚举是 .NET 世界的一等公民。至于结构,我发现在大多数情况下可以使用类,但是对于内存密集型场景,请考虑使用结构。作为一个实际示例,我使用结构作为 OSCAR (ICQ) 协议原语的数据结构。

于 2008-09-01T13:26:42.050 回答
0

我倾向于使用 enum 来避免幻数,我猜这可以通过 const 来克服,但是 enum 允许您将它们分组。

IE

enum MyWeirdType {
TypeA, TypeB, TypeC};

switch(value){
case MyWeirdType.TypeA:
...
于 2008-09-01T13:28:17.337 回答
0

您应该在以下情况下使用值类型:

  • 不需要使用类(不需要继承)
  • 您要确保不需要初始化类型。
  • 您有理由希望在堆栈空间中分配类型
  • 您希望该类型在分配时是一个完全独立的实体,而不是像在引用类型中那样指向实例的“链接”。
于 2008-09-01T13:46:15.297 回答
0

正是大多数其他人使用它们的目的......快速和轻量级的数据/值访问。以及将属性(当然是有意义的)分组到对象中的理想选择。

例如:

  • 显示/数据值差异,例如图像名称的字符串对和控件的路径(或其他)。您希望在后台工作的路径,但名称对用户可见。
  • 对象度量值的明显分组。我们都知道大小等,但在很多情况下,基本“度量”类型对您来说还不够。
  • 枚举值的“打字”,不仅仅是一个固定的枚举,但不是一个完整的类(已经提到过,只是想提倡)。

记住值和引用类型之间的区别很重要。如果使用得当,它们可以真正提高代码的效率,并使对象模型更加健壮。

于 2008-09-01T13:49:48.907 回答
0

值类型,特别是结构和枚举,在面向对象编程中有适当的用途。

正如 aku 所说,枚举是 .NET 中的一等公民,它可以用于各种事物,从颜色到对话框选项再到各种类型的标志。

就我的经验而言,结构和数据传输对象一样棒;无逻辑的数据容器,尤其是当它们主要由原始类型组成时。

当然,原始类型都是值类型,它们解析为 System.Object(不像在 Java 中原始类型与结构无关并且需要某种包装器)。

于 2008-09-01T13:50:03.727 回答
0

实际上,在 .net 3.5 SP1 之前, Vance Morrison 的博客中提到的值类型的密集使用存在性能问题。

据我所知,绝大多数时候你应该使用类,而 JITter 应该保证良好的性能水平。

结构具有“值类型语义”,因此将按值而不是按引用传递。我们可以在以下示例中看到这种行为差异:-

using System;

namespace StructClassTest {

  struct A {
    public string Foobar { get; set; }
  }

  class B {
    public string Foobar { get; set; }
  }

  class Program {
    static void Main() {
      A a = new A();
      a.Foobar = "hi";
      B b = new B();
      b.Foobar = "hi";

      StructTest(a);
      ClassTest(b);

      Console.WriteLine("a.Foobar={0}, b.Foobar={1}", a.Foobar, b.Foobar);

      Console.ReadKey(true);
    }

    static void StructTest(A a) {
      a.Foobar = "hello";
    }

    static void ClassTest(B b) {
      b.Foobar = "hello";
    }
  }
}

该结构将按值传递,因此 StructTest() 将获得它自己的 A 结构,并且当它更改时 a.Foobar 将更改其新类型的 Foobar。ClassTest() 将收到对 b 的引用,因此 b 的 .Foobar 属性将被更改。因此,我们将获得以下输出:-

a.Foobar=hi, b.Foobar=hello

因此,如果您需要值类型语义,那么这将是另一个将某些东西声明为结构的原因。有趣的是,.net 中的 DateTime 类型是一种值类型,因此 .net 架构师认为这样分配它是合适的,确定他们为什么这样做会很有趣:-)

于 2008-09-01T13:53:17.883 回答