.Net中的值类型有什么用?

时间:2008-09-01 13:22:50

标签: .net

official guidelines表明这些实际用途很少。有没有人有他们在哪些方面使用它们的例子?

8 个答案:

答案 0 :(得分:1)

Au Contrare ...你会发现C / C ++人们蜂拥而至a.k.a.值类型。
一个例子是数据包。如果要传输/传输大量数据包,则需要使用值结构来建模数据包 原因:除了实例数据之外,将某些内容转换为类会增加(对象标题中的开销大约8-16字节)。在不可接受的情况下,价值类型是您最安全的选择 另一种用途是需要值类型语义的情况 - 一旦你创建初始化一个对象,它就是readonly / immutable,可以传递给n个客户端。

答案 1 :(得分:1)

在大多数情况下,模仿框架的行为是很好的。许多基本数据类型(如int)都是值类型。如果您具有类似属性的类型,请使用值类型。例如,在编写Complex数据类型或BigInteger时,值类型是逻辑解决方案。框架使用值类型的其他情况也是如此:DateTimePoint等。

如有疑问,请改用参考类型。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我倾向于使用enum来避免使用魔法数字,我可以通过const来克服这个问题,但是enum允许你将它们分组。

enum MyWeirdType {
TypeA, TypeB, TypeC};

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

答案 4 :(得分:0)

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

  • 不需要使用类(不需要继承)
  • 您希望确保无需初始化类型。
  • 您有理由希望在堆栈空间中分配类型
  • 您希望类型在分配时是完整的独立实体,而不是实例的“链接”,因为它在引用类型中。

答案 5 :(得分:0)

正是大多数其他人使用它们来进行快速和轻量级数据/值访问。同时也非常适合将分组属性(在理所当然的地方)放入对象中。

例如:

  • 显示/数据值差异,例如图像名称的字符串对和控件的路径(或其他)。您需要引导工作的路径,但名称对用户可见。
  • 明确对对象指标的值进行分组。我们都知道尺寸等,但可能有很多情况下基本的“指标”类型对你来说还不够。
  • “键入”枚举值,不仅仅是一个固定的枚举,而是一个完整的类(已经提到过,只是想提倡)。

记住differences between value and reference types非常重要。如果使用得当,它们可以真正提高代码的效率,并使对象模型更加健壮。

答案 6 :(得分:0)

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

正如aku所说,Enums是.NET中的一流公民,可以使用各种各样的东西,从Colors到DialogBox选项到各种类型的标记。

根据我的经验,结构很好,作为数据传输对象;无逻辑的数据容器,尤其是当它们主要包含原始类型时。

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

答案 7 :(得分:0)

实际上在.net 3.5 SP1之前,Vance Morrison's blog中提到的大量使用值类型存在性能问题。

据我所知,绝大多数时候你应该使用类,而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的.Fobobar属性将被更改。因此,我们将获得以下输出: -

a.Foobar=hi, b.Foobar=hello

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