1 namespace StructAndClass
2 {
3 internal class PointClass
4 {
5 public PointClass(int x, int y)
6 {
7 X = x;
8 Y = y;
9 }
10
11 public int X { get; set; }
12
13 public int Y { get; set; }
14 }
15 }
2.新建 PointStruct.cs
1 namespace StructAndClass
2 {
3 internal struct PointStruct
4 {
5 public int X { get; set; }
6
7 public int Y { get; set; }
8
9 public PointStruct(int x, int y)
10 {
11 X = x;
12 Y = y;
13 }
14 }
15 }
3.Program.cs
1 using System;
2
3 namespace StructAndClass
4 {
5 internal class Program
6 {
7 private static void Main(string[] args)
8 {
9 Console.WriteLine("PointStruct =====");
10 var pStruct = new PointStruct(10, 10);
11 Console.WriteLine("初始值:x={0},y={1}", pStruct.X, pStruct.Y);
12 ModifyPointStruct(pStruct);
13 Console.WriteLine("調用 ModifyPointStruct() 後的值:x={0},y={1}", pStruct.X, pStruct.Y);
14 Console.WriteLine();
15
16 Console.WriteLine("PointClass =====");
17 var pClass = new PointClass(10, 10);
18 Console.WriteLine("初始值:x={0},y={1}", pClass.X, pClass.Y);
19 ModifyPointClass(pClass);
20 Console.WriteLine("調用 ModifyPointClass() 後的值:x={0},y={1}", pClass.X, pClass.Y);
21 Console.Read();
22 }
23
24 private static void ModifyPointStruct(PointStruct point)
25 {
26 Console.WriteLine("調用方法:ModifyPointStruct");
27 point.X = 20;
28 point.Y = 20;
29 Console.WriteLine("修改成的值:x={0}, y={1}", point.X, point.Y);
30 }
31
32 private static void ModifyPointClass(PointClass point)
33 {
34 Console.WriteLine("調用方法:ModifyPointClass");
35 point.X = 20;
36 point.Y = 20;
37 Console.WriteLine("修改成的值:x={0}, y={1}", point.X, point.Y);
38 }
39 }
40 }
4.結果:

【解析】
ModifyPointStruct(PointStruct point) 調用時修改的只是結構副本,所以原來的結構並沒有發生變化;
ModifyPointClass(PointClass point) 調用時所修改的對象是原對象,因為參數傳遞過來的是一個引用地址,這地址指向原對象
四、總結
結構是值類型並在堆棧中傳遞,每次使用方法進行修改的都只是結構副本;
至於類,傳遞的是內存地址的引用,修改的就是初始值