.NET 中类和结构的区别

灰太狼 2021-06-24 16:11 458阅读 0赞

1. 值类型与引用类型

  • 结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如int对应System.int32结构。
  • 类是引用类型,引用类型在堆上分配地址。
注解:
  • 对结构变量所做的改变不会影响其的原值,而对于类,改变其变量的值会改变其原值。
  • 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
  • 虽然结构和类的类型不一样,可是他们的基类型都是对象,C#中所有的类型的基类型都是object。

2. 继承性

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

3. 内部结构

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

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

code practice:

2789632-e1135507d0686c63.png

code
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace StructAndClass
  7. {
  8. class Program
  9. {
  10. interface ITestInterface
  11. {
  12. void Paint();
  13. }
  14. // define a struct
  15. public struct TestStruct: ITestInterface
  16. {
  17. public string Name;
  18. public int height;
  19. public bool overWeight()
  20. {
  21. return true;
  22. }
  23. public void Paint() { }
  24. }
  25. // define a class
  26. public class TestClass: ITestInterface
  27. {
  28. public string Name = "Time";
  29. public void Paint() { }
  30. ~TestClass()
  31. {
  32. Console.WriteLine("Test class destructor.");
  33. }
  34. }
  35. public sealed class ClassExtend: TestClass
  36. {
  37. public ClassExtend()
  38. {
  39. Console.WriteLine("Test class is extended. However, this class can not be extended.");
  40. }
  41. }
  42. static void Main(string[] args)
  43. {
  44. //TestStruct structOne = new TestStruct();
  45. TestStruct structOne;
  46. structOne.Name = "Tim";
  47. structOne.height = 10;
  48. TestClass classOne = new TestClass();
  49. // error
  50. //TestClass classOne;
  51. //classOne.Name = "Tim";
  52. Console.WriteLine("Struct's base class is object: " + ((structOne is object) ? "Yes" : "No"));
  53. Console.WriteLine("Class's base class is object: " + ((classOne is object) ? "Yes" : "No"));
  54. ClassExtend classExtend = new ClassExtend();
  55. structOne.Name = "Tim Changed";
  56. classOne.Name = "Tim Changed";
  57. Console.WriteLine("Test to change struct variable,name is changed: " + (structOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + structOne.Name);
  58. Console.WriteLine("Test to change class variable, name is changed: " + (classOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + classOne.Name);
  59. Console.ReadKey();
  60. }
  61. }
  62. }

发表评论

表情:
评论列表 (有 0 条评论,458人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C#结构区别

    类(class)和结构(struct)看起来功能差不多,但是内部还是有一些不同。 1. 结构类型是值类型,类类型是引用类型。 2. 凡是定义为结构的,都可以用类定义。

    相关 iOS 结构区别

    1、结构体只能封装属性,类却不仅可以封装属性也可以封装方法。如果一个封装的数据有属性也有行为,就只能用类了。 2、结构体变量分配在栈,而OC对象分配在堆,栈的空间相对于堆来说

    相关 .NET 结构区别

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

    相关 结构区别

    类 vs 结构 类和结构有以下几个基本的不同点: 类是引用类型,结构是值类型。 结构不支持继承。 结构不能声明默认的构造函数。 针对上述讨论,让我们重写前面的实例: