1. 值类型与引用类型


  • 结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如int对应System.int32结构。
  • 类是引用类型,引用类型在堆上分配地址。

注解:

  • 对结构变量所做的改变不会影响其的原值,而对于类,改变其变量的值会改变其原值。
  • 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
  • 虽然结构和类的类型不一样,可是他们的基类型都是对象,C#中所有的类型的基类型都是object。

2. 继承性


  • 结构不能从另一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed。
  • 类完全可扩展的,除非显示的声明sealed,否则类可以继承其他类和接口,自身也能被继承。
    注解:虽然结构不能被继承,可是结构能够继承接口,方法和类继承接口一样。

3. 内部结构


  • 结构没有默认的构造函数,但是可以添加构造函数,没有析构函数,没有abstract 和sealed(因为不能被继承),没有protected修饰符,可以不适用new初始化。
  • 类有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。

4. 申明结构用Struct关键字,申明类用class关键字。

code practice:

.NET  中类和结构的区别_引用类型

code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StructAndClass
{
class Program
{
interface ITestInterface
{
void Paint();
}

// define a struct
public struct TestStruct: ITestInterface
{

public string Name;
public int height;
public bool overWeight()
{
return true;
}
public void Paint() { }
}

// define a class
public class TestClass: ITestInterface
{
public string Name = "Time";
public void Paint() { }

~TestClass()
{
Console.WriteLine("Test class destructor.");
}
}

public sealed class ClassExtend: TestClass
{
public ClassExtend()
{
Console.WriteLine("Test class is extended. However, this class can not be extended.");
}
}

static void Main(string[] args)
{
//TestStruct structOne = new TestStruct();
TestStruct structOne;
structOne.Name = "Tim";
structOne.height = 10;

TestClass classOne = new TestClass();

// error
//TestClass classOne;
//classOne.Name = "Tim";

Console.WriteLine("Struct's base class is object: " + ((structOne is object) ? "Yes" : "No"));
Console.WriteLine("Class's base class is object: " + ((classOne is object) ? "Yes" : "No"));

ClassExtend classExtend = new ClassExtend();

structOne.Name = "Tim Changed";
classOne.Name = "Tim Changed";
Console.WriteLine("Test to change struct variable,name is changed: " + (structOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + structOne.Name);
Console.WriteLine("Test to change class variable, name is changed: " + (classOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + classOne.Name);


Console.ReadKey();
}
}
}

.NET  中类和结构的区别_引用类型_02 公众号_DotNet微说.jpg