.NET中值类型的用途是什么?

时间:2020-03-05 18:45:59  来源:igfitidea点击:

官方指南建议这些几乎没有实际用途。有没有人举例说明了他们在哪里善加利用?

解决方案

回答

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

回答

我倾向于使用枚举来避免幻数,我猜可以用const来克服,但是枚举可以将它们分组。

IE

enum MyWeirdType {
TypeA, TypeB, TypeC};

switch(value){
case MyWeirdType.TypeA:
...

回答

相对而言...我们会发现C / C ++人员蜂拥而至,也就是构造值类型。
一个例子是数据包。如果我们要传输/传输大量数据包,则可以使用值结构对数据包进行建模。
原因:将某些东西变成一个类,除了实例数据外,还增加了对象头中的开销(我忘记了大约8-16字节)。在无法接受的情况下,值类型是我们最安全的选择
另一种用法是在创建对象初始化后就需要值类型语义的情况,该对象是只读/不可变的,可以传递给n个客户端。

回答

每当以下情况,都应使用值类型:

  • 不需要使用类(不需要继承)
  • 我们要确保不需要初始化类型。
  • 我们有理由希望在堆栈空间中分配类型
  • 我们希望该类型在分配时是一个完全独立的实体,而不是像引用类型中那样"链接"到该实例。

回答

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

例如:

  • 显示/数据值的差异,例如图像名称的字符串对和控件的路径(或者其他)。我们需要在后台进行工作的路径,但要使用户看到该名称。
  • 对象指标的值的明显分组。我们都知道大小等,但是在很多情况下,基本的"指标"类型不足以满足需求。
  • 枚举值的"类型",比固定的枚举更多,但不及完整的枚举(已经提到过,只想提倡)。

重要的是要记住值和引用类型之间的差异。正确使用它们可以真正提高代码效率,并使对象模型更健壮。

回答

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

如aku所说,枚举是.NET中的一等公民,它可以用于从Colors到DialogBox选项再到各种类型的标志的各种东西。

就我的经验来看,结构作为数据传输对象很棒。无逻辑的数据容器,尤其是当它们主要包含基本类型时。

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

回答

实际上,在.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架构师认为适当地分配它是合适的,确定为什么这样做是很有趣的:

回答

在大多数情况下,最好模仿框架的行为。许多基本数据类型(例如,int)都是值类型。如果我们具有具有相似属性的类型,请使用值类型。例如,当编写"复杂"数据类型或者" BigInteger"时,值类型是合理的解决方案。对于框架使用值类型的其他情况也是如此:DateTime,Point等。

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