主頁 > 軟體設計 > c#入門學習

c#入門學習

2021-01-25 11:35:51 軟體設計

c # 基礎入門

(純小白的學習記錄)
變數
常量
轉義字符
型別轉換
例外捕獲
算術運算子
條件分支陳述句
顯示轉換
資料變數型別
陣列
值型別和參考型別

變數

一、變數

1.變數的型別

有符號 所占位元組數(位元組數越大,范圍越大)

sbyte(-128~127) 1
int(-21億多~21億多) 4
short(-3萬多~3萬多) 2
long (-9百萬兆多~9百萬兆多) 8

無符號 ----不能裝負數

byte (0~255) 1
uint (0~42億多) 4
ushort (0~6萬多) 2
ulong (0~18百萬兆多) 8

浮點數

float (7~8位有效數字) 4
double (15~17位有效數字) 8
decimal (27~28位有效數字) 16

特殊

bool (true 和false) 1
char (一個字符) 2
string (一串字符) 【該字串較為特殊,范圍可變】

2.變數的儲存空間
1byte = 8bit
1MB = 1024 byte
1GB = 1024MB
1TB = 1024 GB

通過sizeof 方法 可以獲取變數型別所占的記憶體空間(單位:位元組)
(sizeof 是不能得到string 型別所占的記憶體大小的,因為string字串的長度是可變的)

int sbyteSize= sizeof (sbyte);
  Console.WriteLine("sbyte 所占的位元組數為:” +sbyteSize);

3.變數的本質是2進制

計算機中所有資料的本質都是二進制,實際上是一堆0和1
資料傳遞只能通過電信號,只有開和關兩種,所以就用0和1 表示這兩種狀態

1bit就是一個數,要不是0要不是1,為了表示資料方便,出現一個叫bite(位元組)的單位,它是由8個bit組成的存盤單位,所以我們一般說一個位元組為8位

4.變數的命名規范

規則
1.不能重名
2.不能以數字開頭
3.不能使用程式關鍵字命名
4.不能有特殊符號,下劃線除外

*建議的命名規則 變數名要有含義,用英文表示變數的作用 ,盡量不用漢字

*命名法

駝峰命名法 (變數)
首字母小寫,之后單詞首字母大寫,相當于間隔的作用

帕斯卡命名法 (函式,類)
所有字母都大寫

常量

二、常量

1.常量的申明
關鍵字 const
const 變數型別 變數名 = 初始值

常量的申明 const int i2 = 20;
變數的申明 int i = 10;

2.常量的特點
//變數的申明可以不初始化
string name;
//之后可以修改
name = “123”;
name = “345”;

3.常量的申明必須初始化,且不能被修改
const string myName = “肖戰”;
//常量的作用,申明一些常用的不變的量

轉義字符

三、 轉義字符

定義 它是字串的一部分,用來表示一些特殊含義的 字符,如在字串中表現單引號雙引號 空行等等

1.固定寫法 \字符
不同的 \和字符的組合,表示不同的含義

2.轉義字符,舉例單引號

  string str = "\'哈哈哈\'";
        Console.WriteLine(str);

單引號 ’
雙引號 "
換 行 \n
斜杠 \ (計算機檔案路徑 是要用到 \ 符號的)

不常用的轉義字符
制表符 tab鍵,快速空四格      \t
游標退格   \b
空字符      \0
警報音       \a

4.取消轉義字符

 string str2 = @"哈哈\哈哈”;
Console.WriteLine(str2);
 

本來\是不能在該字串中體現,但是現在加了@,列印出后就是 哈哈\哈哈

型別轉換

四、型別轉換(不用變數型別間的轉換)

       //隱式轉換----不同型別間的自動轉換
           大范圍裝小范圍

        //1.相同大型別之間的轉換
        //有符號  long  int  short   sbyte(范圍一次減小)
        long l = 1;
        int  i = 1;
        short s = 1;
        sbyte sb = 1;

        l = i ;
        //隱式轉換int 轉換成了long,可用大范圍裝小范圍, i= l  就不能實作
  • decimal 這個型別 沒有辦法用隱式轉換去存盤float 和double,但是可以隱式存盤整形(有符號和無符號);特殊型別(bool char string)之間不存在隱式轉換

         //2.不同大型別之間的轉換
          *無符號和有符號之間
         (1)無符號裝有符號(不能實作)
         //有符號的變數是不能隱式轉換成 無符號的
       (2)有符號裝無符號(可以)
         // 只要有符號的變數 都在無符號變數的范圍內
         *浮點數  可以裝任何型別 整數的
         *整數  不能裝浮點數
         *特殊型別 和其他型別之間 
         //bool沒有辦法和其他型別相互轉化 ;char 沒辦法隱式儲存其他型別的變數,但是可以隱式轉換成 整形和浮點型
        //char隱式轉換成數值型別,對應的數字其實是一個ASCII碼(百度搜),計算機里存盤二進制,字符中文英文標點符號在計算機中其實都是一個數字,一個字符對應一個數字,ASCII碼就是一種對應關系
    

    總結 double–>float—>整數(有符號,無符號)---->char
    decimal ---->整數(有符號,無符號)---->char
    string 和bool 不參與隱式轉換規則

例外捕獲

五、例外捕獲

//例外捕獲作用
//將玩家輸入的內容存盤 string 型別的變數(容器)中
string str = Console.ReadLine() ;
//Parse轉字串 為 數值型別時 必須要合法合規
int i = int.Parse(str);
//通過對例外捕獲的學習,可以避免當代碼報錯時,造成程式卡死的情況

         //必備部分
         try
         {
           //希望進行例外捕獲的代碼塊
           //如果try中的代碼 報錯了不會讓程式卡死
         }   
         catch
         {
              //如果出錯了  會執行  catch中的代碼 來捕獲例外
              //catch(Exception e )具體報錯跟蹤 通過e得到 具體的錯誤資訊
         }
         //可選部分
         finally
         {
             //最后執行的代碼  不管有沒有出錯 都會執行其中的代碼
            // 目前可以不用
         }
            // try
            //{
            //    string str = Console.ReadLine();
            //    int i = int. Parse(str);
            //    Console.WriteLine(i);
            //}
            //catch
            //{
            //    Console.WriteLine("請輸入合法數字");
            //}

//注意 例外捕獲代碼基本結構中 不需要加 ; 在里面寫代碼邏輯的時候 每句代碼才要加 分號

算術運算子

六、算術運算子

1.賦值符號
//=
//先看右側 再看左側 把右側的值賦給左側的變數

2.算術運算子

// +

(1) 用自己計算 先算右側結果 再賦值給左側變數
int i = 1;
i = i +2;
(2)連續運算
(3)初始化就運算 先算右側結果 再賦值給左側變數
int i2 = 1+2+3;
Console.WriteLine(i2);

// 除法

  int chu = 1;
        chu = 10 / chu;
        Console.WriteLine(chu);
       默認的整數  是int型別  如果用來做除法運算  會丟失小數點后的小數
       如果想用浮點數來存盤 一定是 在運算的時有浮點數的特征
  chu = 1;
        chu = 1 / 2;
        Console.WriteLine(chu);
        float f = 1 / 2f;
        Console.WriteLine(f);

//取余 %

int y= 4;
y = y % 3;
Console.WriteLine(y);

3.算術運算子的優先級

先乘除后加減

4.復合運算子

//固定寫法  運算子=
        // +=   -=  *=   %=
       // 復合運算子  用于  自己= 自己進行運算
  int i3 = 1;
        i3 += 2;// i3 = i3 + 2 ;
        Console.WriteLine(i3);

//復合運算子 只能進行一種運算 不能混合

5.算數運算子的自增減

 //自增運算子   讓自己+1
    a2 = 1;
    Console.WriteLine(a2++);//先用再加   //1
    //2
    Console.WriteLine(++a2);//先加再用    //3

//只有加減才有自增減

6.字串的拼接1

//之前的算術運算子只是用來數值型別變數進行數學運算的 //而string 不存在算術運算子 但是可以通過 + 號來進行字串 的拼接

string str = "123";
            str = str + "456";
            Console.WriteLine(str);
            str = str + 1;
            Console.WriteLine(str);

復合運算子

str = "123";
        str += "1" + 4 + true;
        Console.WriteLine(str);

        str += 1 + 2 + 3 + 4;
        Console.WriteLine(str);

        str +=  ""  + 1 + 2 + 3 + 4;
        Console.WriteLine(str);

        str = "";
        str += 1 + 2 + "" + (3 + 4);
        Console.WriteLine(str);

字串的拼接2

//固定語法
//string.Format(“待拼接的內容”,內容1,內容2,…);
//想要被拼接的內容用占位符代替 {數字} 數字:0-n,依次往后

  string str2 = string.Format("我是{0},我今年{1}歲,我想要{2}", "王垚", "18", "去重慶");
        Console.WriteLine(str2);

        //控制臺列印拼接
        //后面的內容比占位符 多  不會報錯,比占位符少 會報錯
        Console.WriteLine("A{0},B{1},C{2}", 1, 2, 3);
        Console .Write("A{0},B{1},C{2}", 1, 2, 3);

7.條件運算子

特殊噠 是否等于 == 是否不等于 !=

//不能直接純比較不使用,那么這對我們來說沒有意義
//比較的結果 回傳的是 一個bool 型別的值
//true 和false 如果條件滿足 那就回傳true 不滿足 就回傳false

int a = 5;
int b = 10;
bool result = a > b;
Console.WriteLine(result);//false

8.邏輯運算子

//邏輯與
//符號 && 并且
//規則 對兩個bool值進行邏輯運算 有假則假 同真為真

   bool result = true && false;
            Console.WriteLine(result);
            result = true && true;
            Console.WriteLine(result);
        //bool 相關型別  bool變數
        //邏輯運算子優先級  低于 條件運算子 算數運算子
        int i = 3;
        result = i > 1 && i < 5;
        Console.WriteLine(result);

//多個邏輯與 組合運用 在沒有括號的情況下 從左到右 依次看即可

//邏輯或
//符號 ||
// 規則 對兩個bool 值進行邏輯運算 有真則真 同假為假

  result = true || false;
        Console.WriteLine(result);

//邏輯非
//符號 !
//規則 對一個bool 值進行取反 真變假 假變真

  result = !true;
        Console.WriteLine(result);

邏輯非的優先級 較高

//混合使用優先級問題
    // 規則  邏輯非 優先級最高    邏輯與 優先級 高于 邏輯非
    //邏輯運算子 優先級 低于 算數運算子  條件運算子(邏輯非除外)
   //eg  
        bool gameOver = false;
        int hp = 100;
        bool isDead = false;
        bool isMustOver = true;
        result = gameOver || hp < 0 && !isDead || isMustOver;
        //       false || false && truje || true 
        //       false || false ||true 
        //        false ||true
        //        true
        //邏輯運算子短路規則
        // 只要 邏輯與 或者 邏輯或 左邊滿足了條件,右邊的內容 就不重要了

        //邏輯或  有真則真  左邊只要為真 右邊就不用管了,若左邊為假  仍需管右邊
        int i4 = 1;
        result = i4 > 0 || ++i4 >= 1;//只看 i4>0 為 真
        Console.WriteLine(result);
        //邏輯與  有假則假

9.位運算子

主要用 數值型別進行計算的
//將數值轉為 2進制(除2取余數) 再進行位運算

//位與 &
//規則 連接兩個數值 進行位計算 將數值轉為2進制
//對位運算 有0則0

int c = 1;//001
int d = 5;//101
//   001
//&  101
//   001   (可以從右往左看   發現 最左邊的數有0,1  則 有0即0

int e = c & d;
Console.WriteLine(e);

//位或 |
//規則同上
//對位運算 有1則1

//異或 ^
//規則同上
//對位運算 相同為0 不同為1

位取反 ~
規則 寫再數值前面 將數值轉為2進制
對位運算 0變1 1變0

 a = 5;
        //0000 0000 0000 0000 0000 0000 0000 0101 從(int 型別 完整的二進制數)
        //1111 1111 1111 1111 1111 1111 1111 1010  ( 此數代表負數)
        //反碼補碼知識
        c = a;
        Console.WriteLine(c);

//左移 << 和 右移 >>
//規則 讓一個數的 2進制數進行 左移和右移
//左移幾位 右側加幾個0
//右移幾位 右側去掉幾個數

 a = 5;//101
            c = a << 5;
            Console.WriteLine(c);

            // 1位 1010
            // 2位 10100
            // 3位 101000

10.三目運算子

套路 3個空位 2個符號
// bool型別 ? bool 型別為真回傳內容 : bool型別為假回傳內容:
//三目運算子 會有回傳值 這個回傳值型別必須一致 并且必須使用

 int m = 5;
        str = m < 1 ? "m大于1" : "m不滿條件";
        Console.WriteLine(str);

        //第一個空位 始終是結果為bool型別的運算式 bool變數 條件運算式 邏輯運算子運算式
        //第二個空位 什么運算式均可 只要保證他們的結果型別是一致的

條件分支陳述句

七、條件分支陳述句

讓順序執行的代碼 產生分支

1.if陳述句

//if
//作用 滿足條件時 多執行一些代碼
//語法
//if (bool型別值) //bool型別相關: bool變數 條件運算子運算式 邏輯運算子運算式
// {
// 滿足條件要執行的代碼
// }
//注意
//if 陳述句的語法部分 不需要寫分號
// if 陳述句可以嵌套使用

   if (true)
        {
            Console.WriteLine("肖戰真好看");
        }
        Console.WriteLine("肖戰非常好看");
 //嵌套使用(可無限)
    string name = "if you";
    string passWord = "666";
    if (name == "if you" && passWord == "666") ;
    {
        Console.WriteLine("用戶名驗證成功");
        if (passWord == "666") ;
        {
            Console.WriteLine("密碼驗證成功");
        }

    }

//if else
//作用 產生兩條分支 滿足條件做什么 不滿足條件做什么

語法
        //if (bool型別值)
        // {
        //  滿足條件執行的代碼;
        //}
        //else
        //{
        //  不滿足條件執行的代碼;
        //}

if (true)
{
Console.WriteLine(“想去重慶”); //上面為 true 就執行這個
}
else
{
Console.WriteLine(“好想去重慶”); //上面為 false 就執行這個
}

        //if...  else if   ...else
        //if  (bool型別值)
        //{
        //滿足條件執行的代碼
        //}
        //else if  (bool型別值)
        //{
        //滿足條件執行的代碼
        // }
        //else
        //{
        //不滿足條件執行的代碼
        //}

else 是可以省略的
//注意 條件判斷 從上到下執行 滿足了第一個以后 后面的都不會執行了

2.switch陳述句
//作用 讓順序執行的代碼 產生分支

//switch (變數)
//{
// 變數 == 常量 執行 case 和 break 之間的代碼
// case 常量:(這是冒號)
// 滿足條件執行的代碼邏輯;
// break;
// default:(這是冒號)
// 如果上面case 的條件都不滿足 就會執行 default 中的代碼
// break;
//}

//常量 只能寫一個值 不能寫一個范圍,如條件運算子 邏輯運算子一類
//switch 只判斷 變數是否等于某一個固定值

  int k = 3;
             switch (k)
             {
                 case 1:            //case 后一定是常量
                     Console.WriteLine("k等于1");
                     break;
                 case 2:
                     Console.WriteLine("k等于2");
                     break;
                 case 3:
                     Console.WriteLine("k等于3");
                     break;
                 default:
                     Console.WriteLine("什么條件都不滿足 執行default 中的內容");
                     break;
 
             }
             //上述中k不等于3時 就直接執行default 
             //default 可以省略  ,是在你default中什么都不想強調的時候
 
 

  可以自定義常量
        //規則1.必須初始化 2.不能修改
        char p = 'A';
        const char c2 = 'A';
        //下面寫switch陳述句

//貫穿
//作用 滿足某些條件時 做的事情是一樣的 就可以貫穿

不寫case 后面配對的break 就叫做貫穿

 int aa = 1;
        switch (aa)
        {
            case 1:
            case 2:
            case 3:
                Console.WriteLine("啊哈");
                break;
            default:
                break;
        }

3.while 陳述句
// 作用 可以不停的 回圈執行某一代碼塊的內容,區別于條件分支陳述句(讓代碼產生分支)

//while (bool 型別的值)
// {
//滿足條件的時候 會執行 while 陳述句塊中的內容
//…
//當代碼邏輯執行完 會回到while 回圈開頭 再次進行條件判斷
// }
//Console.WriteLine (“主代碼邏輯”)

//死回圈
//*只在目前學習控制臺程式時 頻繁使用,之后用unity時 基本不用死回圈
//1.可能因為記憶體問題 造成程式崩潰 閃退 2.造成程式卡死

        //死回圈舉例
        //  while  (true)
        //{
        //    Console.WriteLine("*******");
        //    Console.WriteLine("請玩家輸入用戶名密碼");
        //    Console.ReadLine();
        //}


        //非死回圈
        // 計算一個為 0的 整形變數 讓他只能累加1,不停的加到10為止

        int j = 0;
        while (j < 10)
        {
            ++j;
        }
        Console.WriteLine(j);

while 可嵌套

int a4 = 0;
while (a4 < 10) ;
{
    ++a4;
    int b2 = 0;
    while (b2 < 10)// 這里回圈的b2和上一行中的b2 沒有關系
    {
        ++b2;
    }
}
        //流程控制關鍵詞
        //作用  控制回圈邏輯的關鍵詞

break 跳出回圈

 while (true)
        {
            Console.WriteLine("啦啦啦啦我最可愛");
            break;//之后代碼不再進行
        }

        int o = 0;
        while (true)
        {
            ++i;
            Console.WriteLine(o);
            if (o == 10)
            {
                break;//break只與 while ,switch 配套 ,與if 沒有關系,這里if 中的break 會直接跳出整個代碼塊
            }
        }
        Console.WriteLine(o);

continue 回到回圈開始 繼續執行

 while (true)
        {
            Console.WriteLine("嘿嘿 喜歡帥哥");
            continue; // 不會跳出代碼塊 而是回傳回圈
        }

回圈陳述句 do… while

        //while回圈 先判斷條件再執行
        //do while回圈 先斬后奏 先至少執行一次回圈陳述句塊中的邏輯 再判斷是否繼續

        // do
        // {
        //    //do while 回圈陳述句塊
        //  } while (bool型別的值);
int f1 = 1;
do
{
    Console.WriteLine(" f1");
} while (f1 < 2);
        do
        {
            Console.WriteLine(" f1");
            continue;//   這里的continue 不回到do  而是先往下執行到while
        } while (false);

4.for 回圈

//for (/初始運算式/;/條件運算式/;/增量運算式/ )
//{
//回圈代碼邏輯;
// }

// 初始運算式 一般宣告一個臨時變數 用來計數用
// 條件運算式 表明進入回圈的條件 一個bool 型別的結果(bool 變數 條件運算子 條件運算子)
// 增量運算式 用第一個空中的變數 進行 自增減運算

//只有第一次進入回圈的時候 才會呼叫 第一個空中的代碼
//每次進入回圈之前 都會判斷第二個空中的條件 滿足才會進入回圈邏輯

        for (int i8 = 0; i8 < 10; i8++)
        {
            Console.WriteLine(i8);
        }
        //最后列印出來 是0-9的數



        //實際上 規則很簡單
        //第一個空位 申明變數 也可連續申明
        //第二個空位 進入條件 只要是bool 結果的運算式都可以
        //第三個空位 執行一次回圈邏輯后要做的事情 

支持嵌套

        for (int m1=0; m1<0; m1++)
        {
            for (int g = 0; g < 10; g++) 
            {
                Console .WriteLine ( m1 +"_" + g );
            }
        }

        //特殊寫法     平常盡量不要這樣寫  這 三個空可以都空著
        // for 回圈可以寫死回圈
        for (; ; )
        {
            Console.WriteLine("for 回圈的死回圈");

        }

        int k1 = 0;
        for (; k1<10; )
        {
            ++k1;
        }


        for ( k = 0; ; ++k)
        {
            if (k >= 10)
            {
                break;
            }
        }

對比 whlie 回圈
//for 回圈 一般用來準確得到 一個范圍中的所有數 經常使用的是for 回圈

顯示轉換

八、顯示轉換 (手動處理 強制轉換)

1.括號強轉

//作用 一般情況下 將高精度的型別轉換為低精度
//注意;精度問題以及 范圍問題

相同大類的整形

有符號整形 sbyte sb = 1; short s = 1; int i = 1; long l = 1;

s = (short) i ;
Console.WriteLine(s);//括號強轉 的時候  可能會出現范圍問題造成的例外

無符號整形 byte b = 1; uint ui = 1; b = (byte)ui;

浮點之間
float f = 1.1f;
double d =1.12121333f;
-----f = (float)d;
-----Console.WriteLine(f);

無符號和有符號
unit ui2 = 1;
int i2 = 1;
—ui2 = (unit)i2;
—Console.WriteLine(ui2);

浮點和整形(浮點資料強轉成整形時,會直接拋棄小數點后邊的小數)
i2 = (int)1.64f;
Console.WriteLine(i2);

char 和數值型別
i2 = ‘A’;
char c =(char)i2;
Console.WriteLine?;

bool和string
(不能通過括號強轉)

2.Parse法

//作用 把字串型別轉換為對應型別,必須,否則報錯

// 變數型別 . Parse(”字串“);

//有符號
int i4 = int.Parse(“123”);
Console.WriteLine(i4);

3.Convert法

作用 更準確的將各個型別之間進行相互轉化,精度比括號強轉好一點,會四舍五入

語法 Convert.To目標型別(變數或常量)

轉字串 如果是把字串轉成對應型別 那字串一定要合法合規 把bool型別可以轉化 數值型別 true對應1, false對應0

sbyte sb5 = Convert.ToSByte(“1”);
short s5 = Convert.ToInt16(“1”);
int i5 = Convert.ToInt32(“1”);
long l5 = Convert.ToInt64(“1”);

byte b6 = Convert.ToByte(“1”);
ushort us5 = Convert.ToUInt16(“1”);
uint ui5 = Convert.ToUInt32(“1”);
ulong ul5 = Convert.ToUInt64(“1”);

float f5 = Convert.ToSingle(“13.2”);
double f5 =Convert.ToDouble(“13.2”);
decimal de5 = Convert.ToDecimal(“13.2”);

bool boS = Convert.ToBoolean(“true”);
char c5 = Convert.ToChar(“A”);

string strS = Convert.Tostring(123123);

4.其他型別轉string

作用 : 拼接列印

語法: 變數 . toString();

當我們進行字串拼接時,就會自動呼叫 tostring 轉換成string
Console.WriteLine(“123123” + 1 + true);

資料變數型別

九、 資料變數型別

無符號變數 byte ushort uint ulong
有符號變數 sbyte short int long
浮點數 float double decimal
特殊型別 bool char string

變數本質
1byte = 8bit

復雜資料型別

特點
1.資料集合
一般是多個資料集合在一起構成的資料
2.自定義
一般可以自己取名字,可以自定義的資料(變數)

列舉:整形常量的集合,可以自定義
陣列:任意變數型別順序存盤的資料
結構體:任意變數的資料集合,可以自定義

1.列舉

***申明列舉***
enum E_PlayerType
{
    Main,//0   列舉項默認值為0
    Other,//1
}
enum E_MonsterType
{
    Norma,
    Boss,
}

列舉和switch是天生一對

   E_PlayerType playerType = E_PlayerType.Main;
        if (playerType == E_PlayerType.Main)
        {
            Console.WriteLine("主玩家邏輯");
        }
        else if (playerType == E_PlayerType.Other)
        {
            Console.WriteLine("其他玩家邏輯");
        }
//但是一般不用if ,列舉與switch是天生一對,可自動填充,比較簡便
//列舉轉int
        int i = (int)playerType; //()強轉
        Console.WriteLine(i);
        //int也可轉列舉,不常用
        playerType = 0;

        //列舉轉string
        string str = playerType.ToString();//生成時是把列舉項的名字轉換成string,很少使用
        Console.WriteLine(str);

        //string轉列舉
        
        //Parse后第一個引數; 你要轉為的是哪個列舉型別  第二個引數;用于轉換的對應列舉項的字串
        //轉換完成后 是一個通用的型別 我們需要用括號強轉成我們想要的目標列舉型別
        playerType = (E_PlayerType)Enum.Parse(typeof(E_PlayerType), "Other");
        Console.WriteLine(playerType);
        列舉的作用
        在游戲開發中,物件很多時候有許多狀態
        比如玩家 有一個動作狀態 我們需要用一個變數或者標識,來表示當前玩家處于的是哪種狀態
        綜合考慮 可能會用int來表示它的狀態
        行走,待機,跑步這些
        列舉可以幫助我們  清晰的分清楚狀態的含義

陣列

十、陣列

陣列是存盤一組相關型別資料的集合,分為,一維,多維,交錯陣列
一般情況下,陣列都是一維陣列

1.陣列的申明

變數型別[] 陣列名

只是申明了一個陣列,但是沒有開房; 變數型別 可以是我們學過的,也可以是我們沒學過的變數型別

        int[] arr1;

變數型別[] 陣列名 = new 變數型別 [陣列的長度];
int[] arr2 = new int[5];//這種方式 相當于開了5個房間 但是房間里面的int值 默認為0

變數型別[] 陣列名 = new 變數型別 [陣列的長度] {內容1,內容2,…};
int[] arr3 = new int[5] { 1, 2, 3, 4, 5 };
int[] arr4 = new int[] { };

變數型別[] 陣列名 = {內容1,內容2,…};
int[] arr5 = { 1, 2, 3, 4, 5 };

2.陣列的使用
int[] array = { 1, 2, 3, 4, 5 };

1.陣列的長度   Length
 Console.WriteLine(array.Length);

2.獲取陣列中的元素
陣列中的下標和索引 他們是從0開始的
通過 索引下標去 獲得陣列中某一個元素的值時,要注意 不能越界(陣列的房間號范圍時 0~Length -1)

     Console.WriteLine(array[0]);//1
     Console.WriteLine(array[2]);//3
     Console.WriteLine(array[4]);//5

3.修改陣列中的元素

     array[0] = 99;

>             Console.WriteLine(array[0]);

4.遍歷陣列 通過回圈 快速獲取陣列中的每一個元素

  Console.WriteLine("**************");
        for (int i = 0; i < array.Length; i++)
        {
            Console.WriteLine(array[i]);
        }

5.增加陣列的元素
//陣列初始化后 是不能夠 直接添加新的元素的

Console.WriteLine("**************");
        int[] array2 = new int[6];
        //搬家
        for (int i = 0; i < array.Length; i++) 
        {
            array2[i] = array[i];
        }
        array = array2;
        for (int i = 0; i < array.Length; i++) 
        {
            Console.WriteLine(array[i]);
        }
        array[5] = 999;

6.洗掉陣列的元素
陣列初始化以后 是不能 直接洗掉元素的
依舊是搬家的原理

Console.WriteLine("**************");
        int[] array3 = new int[5];
        for (int i = 0; i < array3.Length ; i++)
        {
            array3[i] = array[i];
        }
        array = array3;
        for (int i = 0; i < array3.Length; i++)
        {
            Console.WriteLine(array[i]);
        }

7.查找陣列中的元素
//99 2 3 4 5
//要查找 3這個元素在哪個位置
//只有通過遍歷才能確定 陣列中 是否存盤了一個目標元素

    int a = 3;
            for (int i = 0; i < array.Length ; i++)
            {
                if (a == array[i])
                {
                    Console.WriteLine("和a相等的元素在{0}索引位置", i);
                    break;
                }
            }
        //總結
        //1.概念  同一變數型別的資料集合
        //2.申明  遍歷 增刪查改
        //3.所有的變數型別都可以申明為  陣列
        //4.他是用來批量存盤游戲中的用以型別物件的  容器

3.二維陣列

基本概念
使用兩個下標(索引)來確定元素的陣列
兩個下標可以理解成 行標 和 列標
//eg 矩陣
//1 2 3
//4 5 6
//可以用二維陣列 int[2,3]表示
//好比 兩行 三列 的資料集合

1.二維陣列的申明

 int[,] arr02 = new int[3, 3];
 // 變數型別[,] 二維陣列變數名 = new 變數型別 [ 行,列 ] {  {0行內容1,0行內容2.....}{0行內容1,0行內容2....} ...}

 int[,] arr03 = new int[3, 3] { { 1 , 2 ,3},
                                { 4 , 5, 6 },
                                { 7 , 8 ,9 } };

  //或
 int[,] arr04 = new int[,] { { 1 , 2 ,3},
                             { 4 , 5, 6 },
                             { 7 , 8 ,9 } };
  //或
 int[,] arr05 =  { { 1 , 2 ,3},
                   { 4 , 5, 6 },
                   { 7 , 8 ,9 } };

2.二維陣列的長度

        int[,] array06 = new int[,] { { 1,2,3 },
                                      { 4,5,6 } };
 我們要獲取  行和列分別是多少

   得到多少行
            Console.WriteLine(array.GetLength(0));
            //得到多少列
            Console.WriteLine(array.GetLength(1));

3.獲取二維陣列中的元素

//注意; 第一個元素的索引是0,  最后一個元素的索引肯定是 長度-1
    Console.WriteLine(array06[0,1]);
    Console.WriteLine(array06[1,2]);

4 .修改二維陣列中的元素

 array06[0, 0] = 99;
        Console.WriteLine(array06[0, 0]);
        Console.WriteLine("****************");

5.遍歷二維陣列

   for (int i = 0; i < array.GetLength (0); i++)
    {
        for (int j = 0; j < array.GetLength(1); j++)
        {
            //i  行 0 1 
            //j  列 0 1 2
            Console.WriteLine(array06[i, j]);
            // 0,0  0,1  0,2
            // 1,0  1,1  1,2

        }
    }

6.增加啊陣列的元素

不能在原有的基礎上直接添加或洗掉
            int[,] array07 = new int[3, 3];
            for (int i = 0; i < array.GetLength(0) ; i++)
            {
                for (int j = 0; j < array.GetLength(1) ; j++)
                {
                    array07[i, j] = array06[i, j];
                }
            }
            array06 = array07;
            array06[2, 0] = 7;
            array06[2, 1] = 8;
            array06[2, 2] = 9;
            Console.WriteLine("**************");

//總結
//1.概念 同一變數型別的 行列 資料集合
//2.所有的變數型別都可以宣告為 二維陣列
//3.游戲中一般用來 儲存 矩陣 控制臺小游戲中表示地圖格子

4. 交錯陣列(很少用到)
//交錯陣列 是陣列的陣列 每個維度的數量可以不同
//可以儲同一型別的m行不確定列的資料

        //交錯陣列的申明
        //int[][] arr7;

        //變數型別[][] 交錯陣列名  =  new 變數型別 [行數][]{一堆陣列1,一堆陣列2.....}
        int[][] arr8 = new int[3][];


        int[][] arr9 = new int[3][] {new int[] {1,2,3} 
 ,                                   new int[]{1,2 },
                                     new int[]{1   } };

        //陣列的使用
        int[][] arrray = { new int [] {1,2,3},
                           new int []{4,5}};

        //1.陣列的長度
        //行
        Console.WriteLine(array.GetLength(0));
        //得到某一行的列數
        // Console.WriteLine(array[0].Length);

        //2.獲取交錯陣列中的元素
        // Console.WriteLine(array[0][1]);

        //3.修改交錯陣列中的元素
        //array[0][1] = 99;
        //Console.WriteLine(array[0][1]);

        //4.遍歷交錯陣列
        //for (int i = 0; i < array.GetLength(0); i++)
        //{
        //    for (int j = 0; j <array[i].Length; j++)
        //    {
        //        Console.WriteLine(array[i][j] + " ");
        //    }
        //    Console.WriteLine();
        //}

值型別和參考型別

十一、值型別和參考型別

        //變數型別復習
        無符號整形
        //byte b = 1;
        //ushort us = 1;
        //uint ui = 1;
        //ulong u1 = 1;

        有符號整形
        //sbyte sb = 1;
        //short s = 1;
        //int i = 1;
        //long l = 1;

        浮點數
        //float f = 1f;
        //double d = 1.1;
        //decimal de = 1.1m;

        特殊型別
        //bool bo = true;
        //char c = 'A';
        //string str = "strs";

        //復雜資料型別
        //enum 列舉
        //陣列(一維  二維  交錯)

把以上 學過的 變數型別 分成 值型別和參考型別
參考型別 string 陣列 類
值型別 無符號整形 有符號整形 浮點數 char bool 結構體

     //值型別和參考型別的區別

1.使用上的區別

值型別
int a = 10;
參考型別
int[] arr = new int[] { 1, 2, 3, 4 };

 //申明了一個b讓其等于之前的a
int b = a;
   //申明了一個 arr2 讓其等于之前的  arr
int[] arr2 = arr;
 Console.WriteLine("a = {0}, b = {1}", a, b);
 Console.WriteLine("arr[0] = {0} , arr2[0] = {1}", arr[0], arr2[0]);

  b = 20;
  arr2[0] = 5;
  Console.WriteLine("修改了b和arr2{0}之后");
  Console.WriteLine("a = {0}, b = {1}", a, b);
  Console.WriteLine("arr[0] = {0} , arr2[0] = {1}", arr[0], arr2[0]);

值型別 在相互賦值時 把內容拷貝給了對方 它變我不變
參考型別的相互賦值 時讓兩者指向同一個值 它變我也變

2.為什么有以上區別
值型別 和 參考型別 存盤在的 記憶體區域 是不同的 存盤方式是不同的
值型別 存盤在 堆疊空間 – 系統分配,自動回收,小而快
參考型別 存盤在 堆空間 – 手動申請和釋放,大而慢

arr2 = new int[] { 99, 3, 2, 1 };
        Console.WriteLine("arr[0] = {0} , arr2[0] = {1}", arr[0], arr2[0]);
        //new 了就是新開了房間 和之前沒有什么關系了 所以arr 不會有任何變化
  //特殊的參考型別string

        // string str1 = "123";
        // string str2 = str1;
        //因為string 是 參考型別 按理說 應該是它變我也變
        //但string 很特殊 它具備 值型別的特征  它變我不變
        //str2 = "321";

        //Console.WriteLine(str1);
        //Console.WriteLine(str2);

//string 雖然方便 但是有一個小缺點 就是頻繁的 改變 string 重新賦值
//會產生 記憶體垃圾
//優化替代方案 以后講解

 通過斷點除錯  在監視視窗查看 記憶體資訊
 使用除錯程式時,可以中斷程式的執行以檢查代碼、檢查和編輯變數、查看暫存器、查看從源代碼創建的指令,以及查看應用程式占用的記憶體空間

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/252170.html

標籤:其他

上一篇:2021第三周mybatis框架總結

下一篇:C語言編程>第二十周 ⑤ 請補充main函式,該函式的功能是:如果陣列a的前一個元素比后一個元素大,則把它保存在陣列b中并輸出。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more