值類型和引用類型區別


定義


    被用來存儲特定類型的數據,可以根據需要隨時改變所存儲的數據值。具有名稱,類型和值這就是變量
分類


    值類型
什么樣的變量是值類型呢?看值類型的特點吧
1.值類型變量都存儲在堆棧中。2.訪問值類型變量時,一般都是直接訪問其實例。
3.每個值類型變量都有自己的數據副本,因此對一個值類型的變量的操作不會影響其他的變量。
4.復制值類型變量時,復制的是變量的值,而不是變量的地址
5.值類型變量不能為null,必須具有一個確定的值。
    引用類型
1.必須在托管堆中為引用類型變量分配內存。2.必須使用new關鍵字來創建引用類型變量。
3.在托管堆中分配的每個對象都有與之相關聯的附加成員,這些成員必須被初始化。
4.引用類型變量是由垃圾回收機制來管理的。
5.多個引用類型變量都可以引用同一個對象,這種情形下,對一個變量的操作會影響另一個變量所引用的同一對象。
6.引用類型被賦值之前的值都是null。

看了以上值類型和引用類型大家有什么樣的想法,是不是想問一下什么樣的才是值類型,什么樣的又是引用類型呢?
其實我給大家一個簡單的方法來做判斷,那就是看它New不New如果使用New了肯定是引用類型,如果不使用可以直接認為是值類型
再說類型之間的區別之前我先來說一下變量的定義
格式是:datatype indentifier;
例如:

[C#]  純文本查看 復制代碼
?
01
02
03
int a;
           int c=0;
           c = a;


a這個時候會報

  1. 使用了未賦值的局部變量“a”
復制代碼

這時Vs不會讓我們使用這個變量,除非咱們給他一個值。
如下

[C#]  純文本查看 復制代碼
?
01
02
03
int a=10;
int c=0;
c = a;


這個時候才可以正常使用,這點大家一定要注意
下面我以一個例子來說一下值類型的變量

[C#]  純文本查看 復制代碼
?
01
02
03
04
int a = 1;
           int c = 0;
           c = a;
           c = c + 1;


大家現在可以猜一下c和a的值分別是多少。
看下面,開始我們定義了兩個變量,一個是a=1 c=0
然后呢把a給了c值又讓c加1,我們輸出結果看一下

[C#]  純文本查看 復制代碼
?
01
c=2;   a=1;


這說明什么,雖然說a給了c但是a確不會根據c的變量而改變,這就是值類型的變量

下面咱們再一起來看看引用類型的變量
看代碼

[C#]  純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
public class Student
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string name { get ; set ; }
        /// <summary>
        /// 年齡
        /// </summary>
        public string age { get ; set ; }
    }


首先我們定義一個學生類,
然后看下面代碼

[C#]  純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
//初始化一個學生類對象s
           Student s = new Student()
           {
               //姓名為sufei
               name = "sufei" ,
               //年齡為24
               age = "24"
           };
 
           //定義一個新的學生類對象s1
           Student s1 = s;
           s1.name = "小李" ;
           s1.age = "26" ;


如果我們還安上面的思路來判斷的話輸出 的結果應該是

[C#]  純文本查看 復制代碼
?
01
02
s.name=sufei; s.age=24;
s1.name=小李; s1.age=26;


其實呢,這就是引用類型的特別,真實的結果並不是這樣的
看下輸出的結果

[C#]  純文本查看 復制代碼
?
01
02
03
//現在輸出s1 和s的值
          s.name=小李; s.age=26;
          s1.name=小李; s1.age=26;


為什么他們的值是一樣的呢、
我們並沒有修改s的屬性值啊
其實在 Student s1 = s;這一句時s1得到的並不是s的值,頁是s的地址。當然修改時也是修改的地址對應的值,當然s的值為根據s1的值改變了
好啦大家自己做下測試吧。

 

1.定義變量時,數據類型后面添加“?”

在變量類型后添加“?”表示可空值類型。
例如:

[C#]  純文本查看 復制代碼
?
01
int a = null ;


以上代碼VS會提示錯誤:無法將 Null 轉換成 “int” ,因為它是一種不可以為 null 值的類型。
但寫成以下格式就不會報錯了:

[C#]  純文本查看 復制代碼
?
01
int ? a = null ;


此時,變量a可以為空(null),並且可以通過它的 HasValue 屬性來判斷是否有值,並通過 Value 屬性獲得真正的值。
它可以通過對包裝類型直接賦值的方式隱式創建,如:

[C#]  純文本查看 復制代碼
?
01
int ? a = 50;


如Int32、結構體等這樣的類型是不可能為空的,常見的如int,DateTime都是不可能為空的。所以在需要判斷是否有值的場合,可以用加問號的可空值類型,如int?,DateTime?等
變量的基本說明與定義就到這里止。到具體類型時咱們再一個一個的看他們具體的用法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM