.NET中值类型的用途是什么?
官方指南建议这些几乎没有实际用途。有没有人举例说明了他们在哪里善加利用?
解决方案
回答
枚举是.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等。
如有疑问,请改用引用类型。