C#基礎

来源:https://www.cnblogs.com/tanyuyang/archive/2023/03/21/17241990.html
-Advertisement-
Play Games

1 枚舉 enum E_MonsterType//定義了一個枚舉的變數類型 { normal1,//0 boss = 5,//5 normal2,//6,前一個自動加1 } //枚舉和switch語句天生一對,寫switch時能對枚舉類型自動補全 E_MonsterType monsterType ...


1 枚舉

    enum E_MonsterType//定義了一個枚舉的變數類型
        {
            normal1,//0
            boss = 5,//5
            normal2,//6,前一個自動加1
        }
    //枚舉和switch語句天生一對,寫switch時能對枚舉類型自動補全
    E_MonsterType monsterType = E_MonsterType.boss;/聲明枚舉變數
        switch (monsterType)
        {
            case E_MonsterType.normal1:
                Console.WriteLine("普通怪物邏輯");
                break;
            case E_MonsterType.boss:
                Console.WriteLine("boss怪物邏輯");
                break;
            default:
                break;
        }

2 數組

2.1 數組

    int[] arr1;//聲明數組但沒有初始化
    int[] arr2 = new int[5];//初始化,不設置初始值則預設為0
    int[] arr3 = new int[5] {1,2,3,4,5};//初始化並賦值,設置的長度是多少,則初始一定要賦多少值
    int[] arr4 = new int[] {1,2};//數組長度看大括弧裡面有幾個就是幾個
    int[] arr5 = {1,2,3,4,5,6,7};
    int[] arr6 = new int[8];
    bool[] arr7 = new bool[] { true, false };

    Console.WriteLine(arr5.Length);//數組變數名.Length獲取數組長度
    foreach(int i in arr5)
    {
        Console.WriteLine(i);
    }

    //數組定義之後,是沒辦法直接添加新的元素,只能通過聲明新的數組再複製過去
    for(int i = 0; i < arr5.Length; i++)
    {
        arr6[i] = arr5[i];
    }
    arr6[7] = 8;

2.2 二維數組

    int[,] arr;
    int[,] arr2 = new int[3,3];//初始化一個三行三列全0的二維數組
    int[,] arr3 = new int[3, 3] { { 1, 2, 3 }, 
                                  { 4, 5, 6 },
                                  { 7, 8, 9 } };//初始化並定義三行三列的數組
    int[,] arr4 = new int[, ] { { 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 } };
    int[,] arr5 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

    Console.WriteLine(arr5.GetLength(0));//獲取二維數組的行數
    Console.WriteLine(arr5.GetLength(1));//獲取二維數組的列數

    //foreach也可以按行優先原則輸出二維數組元素
    foreach(int i in arr5)
    {
        Console.WriteLine("{0}",i);
    }

2.3 交錯數組

    int[][] arr1 = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 4, 5 }, new int[] { 6 } };//每行的列數可以不同
    Console.WriteLine($"數組的行數為:{arr1.GetLength(0)}");
    Console.WriteLine($"數組某一行的列數為:{arr1[0].Length}");
    foreach (int[] a in arr1)//交錯數組的元素是數組
    {
        foreach(int b in a)
        {
            Console.WriteLine(b);
        }
    }

3 值類型和引用類型

引用類型:string,數組,類
值類型:其它的,結構體

//無符號整型
    byte b1 = 1;
    ushort us = 1;
    uint ui = 1;
    ulong ul = 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 枚舉
//數組 (一維,二維,交錯)
//類
//結構體

值類型和引用類型區別

值類型 在相互賦值時 把內容複製給對方 它變我不變

引用類型在相互賦值時 讓兩者指向同一個值 它變我也變

    //1、使用上的區別
    //值類型
    int a = 10;
    //引用類型
    int[] arr = { 1, 2, 3, 4, 5, 6, };

    int b = a;
    int[] arr2 = arr;
    Console.WriteLine($"a={a},b={b}");
    Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");

    b = 20;
    arr2[0] = 0;
    Console.WriteLine("修改後:");
    Console.WriteLine($"a={a},b={b}");
    Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");
    //值類型  在相互賦值時 把內容複製給對方 它變我不變
    //引用類型在相互賦值時 讓兩者指向同一個值 它變我也變

    //2、原因
    //它們在記憶體的存儲方式是不同的
    //值類型存儲在 棧空間,由系統分配,自動回收,小而快
    //引用類型存儲在 堆空間,手動申請和釋放,大而慢

    //new了新的記憶體空間,就和arr沒關係了
    arr2 = new int[] {99,1,2,3};
    Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");

string的它變我不變

    //string的它變我不變
    string str1 = "123";
    string str2 = str1;

    //string特殊的地方在於重新賦值時會在堆中重新分配空間,因此它變我不變
    //在頻繁對string重新賦值時,會產生記憶體垃圾
    str2 = "321";

4 函數

4.1 函數語法

    //無參無返回值
    static void SayHello()
    {
        Console.WriteLine("你好!");
    }
    //有參無返回值
    static void SayYourName(string name)
    {
        Console.WriteLine($"你的名字是:{name}");
    }
    //無參有返回值
    static string YourName()
    {
        return "tyy";
    }
    //有參有返回值
    static int Sum(int a, int b) => a + b;//一行代碼的可以用=>表示返回值

    //有參有多返回值(用數組)
    static int[] SumAverage(int a, int b)
    {
        int sum = a + b;
        int avg = sum / 2;
        //int[] arr = { sum, avg };
        return new int[] {sum,avg};//一步返回數組需要new
    }
    
    SayHello();
    SayYourName("tyy");
    SayYourName(YourName());//一個函數的返回值作為另一個函數的參數傳入
    Console.WriteLine(Sum(1,2));
    int[] arr = SumAverage(7, 9);//也用數組接收函數的數組返回值
    Console.WriteLine($"{ arr[0]}, {arr[1]}");

4.2 ref 和 out

作用:可以解決在函數內部改變外部傳入的參數,函數裡面改變外面也會改變

    //普通函數
    static void ChangeValue(int value)
    {
        value = 3;
    }
    static void ChangeArray(int[] arr)
    {
        arr = new int[] { 10, 20, 30 };//重新聲明數組,外面沒有改變
    }
    static void ChangeArrayValue(int[] arr)
    {
        arr[0] = 99;
    }
    
    //參數加ref
    static void ChangeValueRef(ref int value)//定義參數前面加上ref
    {
        value = 3;
    }
    static void ChangeArrayRef(ref int[] arr)
    {
        arr = new int[] { 10, 20, 30 };
    }
    
    //參數加out
    static void ChangeValueOut(out int value)//定義參數前面加上out
    {
        value = 33;
    }
    static void ChangeArrayOut(out int[] arr)
    {
        arr = new int[] { 100, 20, 30 };
    }
    
    int a = 1;
    ChangeValue(a);//a的值沒有改變,因為int是值類型
    ChangeValueRef(ref a);//傳入參數前也要加上ref或out,修改成功
    ChangeValueOut(out a);
    
    int[] arr1 = {1, 2, 3 };
    ChangeArray(arr1);//函數內重新聲明數組,原數組元素值未改變
    ChangeArrayValue(arr1);//a[0]改變了
    ChangeArrayRef(ref arr1);//一起改變了
    ChangeArrayOut(out arr1);

4.3 變長參數 params 和參數預設值

4.3.1 變長參數

params int[]意味著可以傳入任意n個參數,n可以為0,傳入的參數存在arr數組中

  • params 關鍵字後面一定是數組
  • 數組可以是任意類型
  • 函數的參數可以是 其他類型的參數和 params 修飾的參數
  • 最多只能有一個 params 關鍵字,且一定放在最後一組參數
static int Sum(params int[] arr)
{
    int sum = 0;
    for(int i = 0; i < arr.Length; i++)
    {
        sum += arr[i];
    }
    return sum;
}

Sum();
Sum(1, 2, 3, 4, 1, 2, 4, 12, 5, 235, 5, 23, 1, 4, 1);//任意長的參數個數都可以

4.3.2 參數預設值

當函數調用時如果不傳入參數,則使用預設值作為參數傳入
每個參數都可以有預設值,有預設值的參數必須寫在普通參數的後面

static void Speak(string str = "沒什麼說的")
{
    Console.WriteLine(str);
}
Speak();//使用預設參數
Speak("giao!");//使用傳入參數

4.4 函數重載

在同一語句塊中,函數的名字相同,但參數的數量、類型或順序不同,與返回值無關

    static int Sum(int a, int b)
        {
            return a + b;
        }
        
    static int Sum(int a, int b, int c)//參數數量不同
    {
        return a + b + c;
    }

    static float Sum(int a, float b)//參數類型不同
    {
        return a + b;
    }

    static float Sum(float a, int b)//參數順序不同
    {
        return a + b;
    }

    static int Sum(ref int a, int b)//ref和out也算重載,但一個重載的話另一個就不能重載了,兩個中只取一
    {
        return a + b;
    }
    static int Sum(out int a, int b)//ref和out也算重載,但一個重載的話另一個就不能重載了
    {
        a = 1;
        b = 2;
        return a + b;
    }

    static float Sum(int a, int b, params int[] arr)//變長參數重載
    {
        return 1;
    }

5 結構體

struct Student
{
    //public和private修飾結構體中的變數和函數,表示能否被外部使用
    //預設(啥都不寫)為private

    //變數
    public int age;
    public bool sex;
    public int number;
    public string name;

    //函數方法 表現這個結構體的行為,不需要加static關鍵字
    public void Speak()
    {
        //函數中可以直接使用結構體聲明的變數
        Console.WriteLine($"我的名字是{name},今年{age}歲");
    }

    //構造函數 用於在外部方便結構體的初始化
    //沒有返回值,和結構體名字相同,必須有參數,聲明構造函數必須對其中所有變數初始化
    public Student(int age, bool sex, int number, string name)
    {
        //this關鍵字,相同變數名字時來區分自己和參數
        this.age = age;//必須初始化
        this.sex = sex;
        this.number = number;
        this.name = name;
    }
}

    Student s1;
    s1.age = 10;//public才能在外部使用變數和函數
    s1.sex = false;
    s1.number = 1;
    s1.name = "tyy";
    s1.Speak();

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 伺服器渲染技術-Thymeleaf 1.基本介紹 官方線上文檔:Read online 文檔下載:Thymeleaf 3.1 PDF, EPUB, MOBI Thymeleaf 是什麼 Thymeleaf是一個現代的伺服器端Java模板引擎,適用於Web和獨立環境,能夠處理HTML,XML,Java ...
  • ###1.起因: 工作中對接平臺需要將設備的GPS數據傳給平臺,但是平臺採用的不是回調函數將數據直接作為參數返回而是格式化的字元串命令,所以需要將double類型的gps數據格式化輸出到字元串中,項目中之前採用的是sprintf進行格式化輸出,但是通過列印對比發現有精度損失,所以改成先放大數據100 ...
  • 模塊化的基本概念 什麼是模塊化? 模塊化是解決一個複雜問題時,自頂向下逐層把系統劃分為若幹個模塊的過程,編程中,就是遵守一定規則,把一個大文件拆成獨立並相互依賴的多個小模塊。 模塊化規範 使用什麼樣的語法格式引用模塊和向外暴露成員 CommonJS規範 Node.js 遵循了 CommonJS 的模 ...
  • 資源調度器是 YARN 中最核心的組件之一,它是 ResourceManager 中的一個插拔式服務組件,負責整個集群資源的管理和分配。 Yarn 預設提供了三種可用資源調度器,分別是FIFO (First In First Out )、 Yahoo! 的 Capacity Scheduler 和 ... ...
  • 安全配置Security Defenses 通過對Security Defenses的配置 ,可以對http頭添加相應的安全配置 ,如csp, X-Frame-Options, X-Content-Type-Option等 1 X-Frame-Options 你的網站添加了X-Frame-Optio ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。 1. 使用前的準備 參考本人另一篇博客 安裝 Visual Leak Detector 下載 vld-2.5.1-setup.exe 並按步驟安裝 VLD。這一種使用方式的缺點是,當把項目拷貝到別的電腦上編譯運行時,需要按以下流程重新配 ...
  • 由於 Blazor-WebAssembly 是在瀏覽器中運行的,通常不需要執行伺服器代碼,只要有個“窩”能托管並提供相關文件的下載即可。所以,當你有一個現成的 Blazor wasm 項目,沒必要用其他語言重寫,或者你不想用 ASP.NET Core 來托管(有些大材小用了),就可以試試用 node ...
  • 1. Grid佈局 ,(Table 佈局) 兩行兩列佈局, Border 0 行 0 列預設開始 <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...