程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#:淺析結構與類的區別,

C#:淺析結構與類的區別,

編輯:C#入門知識

C#:淺析結構與類的區別,


一、      結構:值類型,存儲在堆棧中,位於計算機的內存邏輯區域中      類   :引用類型,存儲在堆中,位於計算機內存的不同邏輯位置   二、      較小的數據使用結構;      將一個結構值傳遞到方法時,傳遞的是整個數據結構;      傳遞一個類,實際上是將引用傳遞到對象,即只有內存地址;      對結構修改,改變的是結構的副本,這是值類型工作方式的定義:傳遞值的副本;      傳遞一個引用到類本身意味著在類中修改值,實際上改變的是原始對象;   三、代碼栗子   1.新建 PointClass.cs
 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) 調用時所修改的對象是原對象,因為參數傳遞過來的是一個引用地址,這地址指向原對象

四、總結

  結構是值類型並在堆棧中傳遞,每次使用方法進行修改的都只是結構副本;

      至於類,傳遞的是內存地址的引用,修改的就是初始值

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved