C#类和结构简单介绍

开发 后端
这里介绍C#类和结构,一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。如:Geoemtry最好使用类,而 Geometry 中点的成员最好使用结构。

C#语言还是比较常见的东西,这里我们主要介绍C#类和结构,包括介绍C#类和结构示例等方面。

C#类和结构的区别

类:
◆类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
◆类有构造和析构函数
◆类可以继承和被继承

结构:
◆结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
◆结构没有构造函数,但可以添加。结构没有析构函数。
◆结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口。

C#类和结构示例:
根据以上比较,我们可以得出一些轻量级的对象***使用结构,但数据量大或有复杂处理逻辑对象***使用类。如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) ***使用类,而 Geometry 中点的成员***使用结构。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.    
  5. namespace Example16  
  6. {  
  7. interface IPoint  
  8. {  
  9. double X  
  10. {  
  11. get;  
  12. set;  
  13. }  
  14. double Y  
  15. {  
  16. get;  
  17. set;  
  18. }  
  19. double Z  
  20. {  
  21. get;  
  22. set;  
  23. }  
  24. }  
  25. //结构也可以从接口继承  
  26. struct Point: IPoint  
  27. {  
  28. private double x, y, z;  
  29. //结构也可以增加构造函数  
  30. public Point(double X, double Y, double Z)  
  31. {  
  32. this.x = X;  
  33. this.y = Y;  
  34. this.z = Z;  
  35. }  
  36. public double X  
  37. {  
  38. get { return x; }  
  39. set { x = value; }  
  40. }  
  41. public double Y  
  42. {  
  43. get { return x; }  
  44. set { x = value; }  
  45. }  
  46. public double Z  
  47. {  
  48. get { return x; }  
  49. set { x = value; }  
  50. }  
  51. }  
  52. //在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)等复杂操作  
  53. class PointGeometry  
  54. {  
  55. private Point value;  
  56.  
  57. public PointGeometry(double X, double Y, double Z)  
  58. {  
  59. value = new Point(X, Y, Z);  
  60. }  
  61. public PointGeometry(Point value)  
  62. {  
  63. //结构的赋值将分配新的内存  
  64. this.value = value;  
  65. }  
  66. public double X  
  67. {  
  68. get { return value.X; }  
  69. set { this.value.X = value; }  
  70. }  
  71. public double Y  
  72. {  
  73. get { return value.Y; }  
  74. set { this.value.Y = value; }  
  75. }  
  76. public double Z  
  77.  {  
  78. get { return value.Z; }  
  79. set { this.value.Z = value; }  
  80. }  
  81. public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth)  
  82. {  
  83. return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);  
  84. }  
  85. public override string ToString()  
  86. {  
  87. return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);  
  88. }  
  89. }  
  90. class Program  
  91. {  
  92. static void Main(string[] args)  
  93. {  
  94. Point tmpPoint = new Point(1, 2, 3);  
  95.    
  96. PointGeometry tmpPG1 = new PointGeometry(tmpPoint);  
  97. PointGeometry tmpPG2 = new PointGeometry(tmpPoint);  
  98. tmpPG2.X = 4;  
  99. tmpPG2.Y = 5;  
  100. tmpPG2.Z = 6;  
  101.    
  102. //由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样  
  103. Console.WriteLine(tmpPG1);  
  104. Console.WriteLine(tmpPG2);  
  105.    
  106. //由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3  
  107. PointGeometry tmpPG3 = tmpPG1;  
  108. tmpPG1.X = 7;  
  109. tmpPG1.Y = 8;  
  110. tmpPG1.Z = 9;  
  111. Console.WriteLine(tmpPG1);  
  112. Console.WriteLine(tmpPG3);  
  113.    
  114. Console.ReadLine();  
  115. }  
  116. }  

【编辑推荐】

  1. C#静态变量简单分析
  2. C# sealed修饰符学习笔记
  3. C# const和static readonly区别浅谈
  4. C#隐含类型局部变量浅析
  5. C#对象初始化器描述
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-06 14:53:41

C# User类

2009-09-02 14:33:57

C#类实现接口

2009-08-07 09:29:22

C#数组C#函数

2009-09-07 16:09:19

C#和Java特点

2009-08-18 16:57:24

VB.NET和C#

2009-08-20 18:44:54

C#和ADO.NET

2009-08-27 16:18:47

C#类C#结构体

2009-08-12 09:41:28

C# Director

2009-09-03 15:57:11

C# SystemMe

2009-08-07 17:41:40

C#预处理

2009-08-10 16:19:37

C#冒泡排序

2009-08-14 17:27:56

C#方法参数

2009-08-27 10:19:22

C#匿名类型

2009-08-21 17:55:52

C#复合控件

2009-08-18 17:37:57

C#固定指针

2009-08-07 17:12:07

C# DLL函数

2009-08-25 13:38:35

C# Timer组件

2009-09-03 09:40:57

C#创建表单

2009-08-06 18:15:13

C# SQL Serv

2009-08-13 17:36:54

编译C#代码
点赞
收藏

51CTO技术栈公众号