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

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


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

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

一般的区别在于引用类型位于堆上,并且值类型内联,也就是说,无论您的变量或字段是在哪里定义的。

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

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

这有一个好处,首先:

  • 值类型始终包含一个值
  • 引用类型可以包含一个空引用,这意味着它们此刻不会引用任何内容
  • 在内部,引用类型被实现为指针,并且知道并知道变量赋值如何工作,还有其他行为模式:

  • 将值类型变量的内容复制到另一个变量中,将整个内容复制到新变量中,从而使两者不同。 换句话说,复制后,更改为一个不会影响另一个
  • 将引用类型变量的内容复制到另一个变量中,复制引用,这意味着您现在有两个对实际数据的相同存储位置的引用。 换句话说,复制之后,更改一个引用中的数据也会影响另一个引用,但这仅仅是因为您只是在两个地方查看相同的数据
  • 当你声明变量或字段时,以下是两种类型的不同之处:

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

  • 每个简短的摘要:

    类仅:

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

  • 不支持继承
  • 是价值类型
  • 通过值传递(如整数)
  • 不能有空引用(除非使用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.
    

    类可以是什么 - 参考可以指向一个null。

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

    链接地址: http://www.djcxy.com/p/3627.html

    上一篇: What's the difference between struct and class in .NET?

    下一篇: Create Excel (.XLS and .XLSX) file from C#