official guidelines表明这些实际用途很少。有没有人有他们在哪些方面使用它们的例子?
答案 0 :(得分:1)
Au Contrare ...你会发现C / C ++人们蜂拥而至a.k.a.值类型。
一个例子是数据包。如果要传输/传输大量数据包,则需要使用值结构来建模数据包
原因:除了实例数据之外,将某些内容转换为类会增加(对象标题中的开销大约8-16字节)。在不可接受的情况下,价值类型是您最安全的选择
另一种用途是需要值类型语义的情况 - 一旦你创建初始化一个对象,它就是readonly / immutable,可以传递给n个客户端。
答案 1 :(得分:1)
在大多数情况下,模仿框架的行为是很好的。许多基本数据类型(如int
)都是值类型。如果您具有类似属性的类型,请使用值类型。例如,在编写Complex
数据类型或BigInteger
时,值类型是逻辑解决方案。框架使用值类型的其他情况也是如此:DateTime
,Point
等。
如有疑问,请改用参考类型。
答案 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架构师认为分配它是合适的,确定他们为什么这样做会很有趣: - )