學習C#第二天

變數

變數是什麼?

在數學中,我們對變數的概念有一定的了解和認識,如y=x^2,其中,x,y都是變數。

定義

一個變數就是存儲區(記憶體)中的一個存儲單元

變數的聲明及初始化

使用變數的步驟

  1. 聲明一個變數: 根據類型分配空間

    1. 根據指定的類型定義一個變數的名稱

    2. 語法:

                  int money = 5;          //變數類型  變數名 = 數值;

                 int money1;              //變數類型 變數名;
                 money1 = 10;           //變數名 = 數值;

                 int money2, money3, money4;//變數類型 變數名1,變數名2,...,變數名n;

       

  2. 初始化變數: 將數據存入記憶體空間

  3. 使用變數: 取出數據的使用

變數的聲明

聲名變數就是創建一個變數,並給一個名字

變數的命名規則

  1. 變數名 = 首字母(字母或者下劃線“_”)+ 其餘部分(任意多的數字字母下劃線“__”)。不能以數字開頭,一些特殊符號也不能使用。漢字也可以作為變數名,但是不建議使用。

  2. 簡短且能清楚的表明變數的作用,通常第一個單詞的首字母小寫,其他單詞的首字母大寫。例如:myScore

  3. 變數名不能與C#關鍵字衝突,例如:int static = 30;

  4. 變數區分大小寫,兩個同樣的單詞,大小寫有差別的話不衝突。區分開來的

     

簡單數據類型

值類型:直接存儲值

簡單類型
  • 數值型

    • 整數型

      sbyte、short、int、long。正負數都可存儲

      usbyte、ushort、uint、ulong。只能存儲正數

    • 浮點型:

      float a = 1.22f;//在值的後邊加上f則為指定賦值為float類型
                 double b = 1.22d;//在值的後邊加上d則為指定賦值為double類型
                 double c = 11.1;//double類型默認省去後綴d。其他類型不行
                 decimal d = 1.11m;//此類型時專門用來提供貨幣計算的,精度非常高,賦值時需要在後綴加M或m

       

  • 字元型

    • String

      String和string不區分大小寫,和object差不多。最主要簡化的作用時簡化字元串操作。它是特殊的引用類型,它擁有不可改變性,它賦值之後數據不會改變,表面上的改變,實則是在記憶體中重新生成了另一個對象,並給予賦值。

    • char

      該類型基本用不到,我只知道java中的io流會用,C#初學完全用不到貌似

  • 布爾型

    • 布爾類型主要用於來表示true/false值,C#中定義布爾類型時,需要使用bool關鍵字,它的值只能是true或者false,它的默認值時false

    • true

    • false

引用類型:存儲對值的引用

object類型

object = System.Object

object是所有類的基類。在定義其它類時,可以直接使用object提供的一些通用方法。

String類型

string = System.String

在簡單類型中字元類型里記錄過,不再詳寫。

引用類型就是引用別的類為自己所用,其中賦予的值是互通的,都存放在堆裡邊,而對象名(先創建需要引用的類的對象,才能引用該類中的數據)則存儲在棧裡邊,指向對應的堆中的數據。值類型都存放在棧裡邊。

變數的初始化

給一個變數賦值,就是給該變數初始化。

變數的作用域

class Program
  {
   String str = "實例變數";//實例變數在類中,方法外創建的變數為成員變數。
   static String str2 = "靜態變數";//靜態變數
       static void Main(string[] args)
      {
           Program program = new Program();//先創建類的對象
           Console.WriteLine(program.str);       //然後通過類的對象來調用實例變數

           Console.WriteLine(str2);//直接調用靜態變數
           int a =  0;//在方法體內創建的變數就是局部變數
           Console.WriteLine(a);//方法中使用局部變數可以直接調用

           Console.WriteLine();//無法使用另一個方法內的局部變數!!!
           Console.ReadLine();
      }
       static void Test()
      {
           int b = 2;
           Console.ReadLine();
      }
  }

引用類型和值類型的區別

值類型就是簡單的一對一存儲,都存儲在棧中,不可互通。

引用類型則是多對一,引用數據存儲單獨在堆中,而需要引用該數據的對象名則存儲在棧中,分別對應堆中的存儲數據。堆中的存儲數據改變後,每個引用該數據的對象都會發生變化。

class Program
  {
       static void Main(string[] args)
      {
           RefAndValue.Record();
           Console.Read();
      }
  }

   class Card                                         //1. 創建一個類
  {
       public string Name { get; set; }    //2. 給類中定義一個引用類型
       public int Age { get; set; }            //3. 再給類中定義一個值類型
  }
   static class RefAndValue                  //4. 再定義一個引用類型和值類型的對比類,來進行對比操作
  {
       public static void Record()           //5. 定義一個靜態方法便於調用
      {
           Card card1 = new Card { Age = 18, Name = "張三" };//6. 創建一個Card的對象,並初始化
           Card card2 = new Card { Age = 20, Name = "趙四" };//7. 再創建一個Card對象,並初始化
           int age = card1.Age;                //8. 使用int對象來記錄未修改前的值
           card1.Age = 30;                       //9. 對值類型修改,之後來查看是否會影響到另外的值

           Card card3 = card2;                 //10. 利用card2創建一個新的Card對象
           card2.Name = "王五";              //11. 修改card2中的引用類型,之後來查看是否會影響另外的值
           Console.WriteLine("card1的Age:" + card1.Age);
           Console.WriteLine("age:" + age);//分別查看倆個值是否一樣

           Console.WriteLine("card2的Name:" + card2.Name);
           Console.WriteLine("card3的Name:" + card3.Name);//分別查看兩個值是否一樣
           //最後再在Main方法中調用來運行,查看結果以作對比。
      }
  }

 

使用變數時的一些錯誤

錯誤都是字面意思QAQ!!!,就不一一闡述啦,就是一些,命名錯誤,忘記賦值,賦值類型錯誤什麼的。報錯框都會寫出來的

枚舉

枚舉相當於一種特殊的欄位,它是值類型的數據。他主要是聲明一種具有相同性質的常量,比如說我們經常使用的日期數據,我們可以把這些數據組織成多個不同名稱的枚舉欄位

  1. 語法:訪問修飾符 enum 枚舉名{值1,值2,值3…}

  2. 枚舉是一組描述性的名稱

  3. 枚舉定義一組有限的值。不能包含方法

  4. 對可能的值進行約束

  5. 枚舉允許描述性名稱表示整數值

    public enum MRKJ//定義一個枚舉
      {
           Java = 1,
           C = 2,
           CS = 3,//如果不給予賦值的話,它會自動從1遞增給予賦值。最後一個不用再加逗號,
      }
       class Program
      {
           static void Main(string[] args)
          {
               int i;
               Console.WriteLine((int)MRKJ.Java);//不加前置轉換的話輸出枚舉欄位,如果加前置轉換的話會輸出枚舉欄位自己的值。
               Console.Read();
          }
      }
  6. 在實際開發中,經常使用枚舉來作為用戶的使用許可權,根據枚舉欄位所表示的用戶許可權來設置各級別的用戶所擁有的不同的操作許可權

數據類型的轉換

  1. 自動轉換

    1. 在某種條件下,系統自動完成類型的轉換(即隱式類型轉換)

      1. 兩種類型兼容。例如:double兼容int類型

      2. 目標類型精度大於源類型。例如:double類型的精度大於int類型

  2. 顯式類型轉換(也叫做前置類型轉換)

    1. (類型名)表達式 ;

      顯式類型轉換會丟失一些精度。操作方式為,在需要轉換的數據前邊加上括弧,括弧內寫轉換後的數據類型。例如

      int i = (int)(11.2+11.3);

      如果被轉換的數據類型大於轉換後的數據類型的區間,並不會報錯,但是會溢出錯誤。比如說轉換前是long類型轉換成int類型是大於int的最大區間。轉換後的值就會變成int最大區間的值。此時需要使用第二種顯式類型轉換。

    2. Convert.To類型名(表達式);

                  double a = 10.5;
                 int c = Convert.ToInt32(a);

      使用此方式,如果出現數據溢出的情況,他會報錯提醒你。

    3. 類型名.Parse(表達式)

      此方法只針對數值類型來轉換,其他的類型是沒有這個方法的。

                  long a = 1111111111111111111;
                 int c = int.Parse(a.ToString());
  3. 裝箱和拆箱

    1. 裝箱

      1. 把值類型轉換成引用類型被稱為裝箱操作

      2.             int a = 10;//定義一個值類型
                   object obj = a;//把值類型轉換成引用類型,把值類型的變數,隱式的轉換為Object的變數。
    2. 拆箱

      1. 把裝箱好的object類型,顯示轉換成值類型

      2.             int a = 10;//定義一個值類型
                   object obj = a;//把值類型轉換成引用類型,把值類型的變數,隱式的轉換為Object的變數。
                   int b = (int)obj;//把裝箱好的引用類型顯式轉化類型為值類型
      3. 執行拆箱操作時,轉換的類型,必須和裝箱時被轉換的值類型的數據類型相同。裝箱時為int,拆箱時也只能拆成int類型。

      4. 裝箱拆箱對於程式的性能影響很大。裝箱時需要重新創建一個全新的對象來存儲它的值。這是肯定會比你直接賦值需要的時間多,拆箱時需要用到前置類型轉換,需要的時間也很多。