.NET中的struct和class有什么区别?

时间:2020-03-05 18:40:02  来源:igfitidea点击:

.NET中的struct和class有什么区别?

解决方案

回答

好吧,对于初学者来说,结构是通过值而不是通过引用传递的。结构适合于相对简单的数据结构,而从架构的角度来看,类通过多态性和继承具有更大的灵活性。

其他人可能会给我们比我更多的细节,但是当我要使用的结构很简单时,我会使用structs。

回答

在.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.

类不能为空,引用可以指向null。

结构是实际值,它们可以为空,但不能为null。因此,结构始终具有默认构造函数,而没有参数,因此它们需要一个"起始值"。

回答

类的实例存储在托管堆上。所有"包含"实例的变量只是对堆上实例的引用。将对象传递给方法会导致传递引用的副本,而不是对象本身。

结构(从技术上讲,值类型)存储在任何使用它们的位置,就像原始类型一样。内容可以在运行时随时复制,而无需调用自定义的复制构造函数。将值类型传递给方法需要再次复制整个值,而无需调用任何可自定义的代码。

C ++ / CLI名称使区分更好:" ref class"是第一个描述的类," value class"是第二个描述的类。 Care使用的关键字" class"和" struct"仅仅是必须学习的东西。

回答

Structs are the actual value - they can be empty but never null

的确如此,但是还请注意,从.NET 2开始,结构支持Nullable版本,并且提供了一些语法糖以使其更易于使用。

int? value = null;
value  = 1;

回答

在.NET中,有两种类型的类型,引用类型和值类型。

结构是值类型,类是引用类型。

通常的区别是,引用类型位于堆中,而值类型则位于内联中,也就是说,无论变量或者字段在何处定义。

包含值类型的变量包含整个值类型值。对于结构,这意味着变量包含整个结构及其所有字段。

包含引用类型的变量包含指针或者对实际值所在的内存中其他位置的引用。

首先有一个好处:

  • 值类型始终包含一个值
  • 引用类型可以包含空引用,这意味着它们目前根本不引用任何内容

在内部,引用类型被实现为指针,并且知道引用类型并知道变量分配如何工作,还有其他行为模式:

  • 将值类型变量的内容复制到另一个变量中,然后将整个内容复制到新变量中,以使两者截然不同。换句话说,复制后,对一个所做的更改不会影响另一个
  • 将引用类型变量的内容复制到另一个变量中,然后复制引用,这意味着我们现在在实际数据的其他存储位置拥有两个相同的引用。换句话说,在复制之后,更改一个引用中的数据似乎也会影响另一个引用,但这仅仅是因为我们实际上只是在两个地方查看相同的数据

声明变量或者字段时,以下是两种类型的区别:

  • 变量:值类型驻留在堆栈上,引用类型驻留在堆栈上,作为指向实际内存所在的堆内存中某处的指针(尽管请注意Eric Lipperts文章系列:堆栈是实现细节)。
  • class / struct-field:值类型完全位于该类型内部,引用类型位于该类型内部,作为指向实际内存所在的堆内存中某处的指针。

回答

每个的简短摘要:

仅限课程:

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

仅结构:

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

类和结构:

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

回答

结构与类别

结构是值类型,因此它存储在堆栈中,而类是引用类型,并存储在堆中。

结构不支持继承和多态,但是类同时支持。

默认情况下,所有struct成员都是公共的,但类成员默认情况下是私有的。

由于结构是值类型,因此我们不能将NULL赋给struct对象,但类并非如此。