.NET中的结构和类有什么区别?


当前回答

每个项目的简短摘要:

仅限班级:

可以支持继承是引用(指针)类型引用不能为空每个新实例的内存开销

仅结构:

无法支持继承是值类型按值传递(如整数)不能有空引用(除非使用了Nullable)每个新实例没有内存开销-除非“装箱”

类和结构:

复合数据类型通常用于包含一些具有某种逻辑关系的变量吗可以包含方法和事件可以支持接口

其他回答

为了使其完整,使用Equals方法时还有另一个不同之处,它由所有类和结构继承。

假设我们有一个类和一个结构:

class A{
  public int a, b;
}
struct B{
  public int a, b;
}

在Main方法中,我们有4个对象。

static void Main{
  A c1 = new A(), c2 = new A();
  c1.a = c1.b = c2.a = c2.b = 1;
  B s1 = new B(), s2 = new B();
  s1.a = s1.b = s2.a = s2.b = 1;
}

然后:

s1.Equals(s2) // true
s1.Equals(c1) // false
c1.Equals(c2) // false
c1 == c2 // false

因此,结构适用于类似数字的对象,例如点(保存x和y坐标)。课程适合其他人。即使两个人的名字、身高、体重。。。,他们还是两个人。

每个项目的简短摘要:

仅限班级:

可以支持继承是引用(指针)类型引用不能为空每个新实例的内存开销

仅结构:

无法支持继承是值类型按值传递(如整数)不能有空引用(除非使用了Nullable)每个新实例没有内存开销-除非“装箱”

类和结构:

复合数据类型通常用于包含一些具有某种逻辑关系的变量吗可以包含方法和事件可以支持接口

在.NET中,结构和类声明区分引用类型和值类型。

传递引用类型时,实际存储的只有一个。访问实例的所有代码都在访问同一个实例。

传递值类型时,每个值类型都是副本。所有代码都在自己的副本上运行。

这可以用一个例子来说明:

struct MyStruct 
{
    string MyProperty { get; set; }
}

void ChangeMyStruct(MyStruct input) 
{ 
   input.MyProperty = "new value";
}

...

// Create value type
MyStruct testStruct = new MyStruct { MyProperty = "initial value" }; 

ChangeMyStruct(testStruct);

// Value of testStruct.MyProperty is still "initial value"
// - the method changed a new copy of the structure.

对于一个班级来说,这将是不同的

class MyClass 
{
    string MyProperty { get; set; }
}

void ChangeMyClass(MyClass input) 
{ 
   input.MyProperty = "new value";
}

...

// Create reference type
MyClass testClass = new MyClass { MyProperty = "initial value" };

ChangeMyClass(testClass);

// Value of testClass.MyProperty is now "new value" 
// - the method changed the instance passed.

类可以是空的-引用可以指向空。

结构是实际值-它们可以为空,但决不能为空。因此,结构总是有一个没有参数的默认构造函数——它们需要一个“起始值”。

结构是实际值-它们可以为空,但不能为空

这是正确的,但是也要注意,从.NET2开始,结构支持Nullable版本,C#提供了一些语法糖,使其更易于使用。

int? value = null;
value  = 1;

首先,结构是通过值而不是引用传递的。结构适用于相对简单的数据结构,而类通过多态性和继承从体系结构的角度来看具有更大的灵活性。

其他人可能会比我给你更多的细节,但当我所追求的结构很简单时,我会使用结构。