C#面向對象核心-其它

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

其他 1 命名空間 命名空間用來組織和重用代碼的,命名空間就像一個工具包,類就像工具。 1.1 使用 namespace MyGame { class GameObject { } } namespace MyGame//命名空間可以分開寫 { class Player : GameObject { ...


其他

1 命名空間

命名空間用來組織和重用代碼的,命名空間就像一個工具包,類就像工具。

1.1 使用

namespace MyGame
{
    class GameObject
    {

    }
}

namespace MyGame//命名空間可以分開寫
{
    class Player : GameObject
    {

    }
}

1.2 不同命名空間中相互使用

使用 using 命名空間名命名空間名.內容 來使用所需命名空間的內容。

1.3 不同命名空間中允許有同名類

此時要使用同名類,必須指明出處的使用方法:命名空間名.類名

namespace MyGame2
{
    class GameObject//不同命名空間的同名類
    {

    }
}

1.4 命名空間可以包裹命名空間

表示工具包裡面的小包,若要使用小包,必須using到小包,如:using MyGame.UI,只using MyGame是無法使用UI的。

namespace MyGame
{
    namespace UI
    {
        class Image
        {

        }
    }

    namespace Game
    {
        class Image
        {

        }
    }
}

//Main
GameObject g = new GameObject();
MyGame.UI.Image i = new MyGame.UI.Image();

1.5 關於修飾類的訪問修飾符

  • public 公有類,命名空間中的類預設為public
  • internal 內部類,只能在該工程的程式集中使用
  • abstract 抽象類
  • sealed 密封類
  • partial 分部類

2 object 中的方法

2.1 靜態方法

Equals:判斷兩個對象是否相等,返回true或false
最終的判斷權由左側對象決定,不管是值類型還是引用類型都按照左側對象的規則來比較

ReferenceEquals:判斷兩個對象是否是相同的引用,用來比較引用類型的對象
值類型對象的返回值始終是false

class Test
{

}

//Main
Console.WriteLine(Object.Equals(1, 1));//值類型

Test t1 = new Test();
Test t2 = new Test();
Test t3 = t1;
Console.WriteLine(Object.Equals(t1,t2));//引用類型
Console.WriteLine(Object.Equals(t1,t3));

Console.WriteLine(ReferenceEquals(1,1));//object是所有類型的基類,直接用靜態方法也可以
Console.WriteLine(Object.ReferenceEquals(t1,t3));

/*
輸出:
True
False
True
False
True
*/

2.2 成員方法

GetType:獲取對象運行時的Type類型
通過Type結合反射相關知識點可以做很多關於對象的操作

MemberwiseClone:獲取對象的淺拷貝對象
返回一個新的對象,新對象的引用變數會和老對象一致

2.3 虛方法

虛方法可以 override 重寫。

Equals:預設實現還是比較兩者是否為同一個引用,相當於ReferenceEquals
微軟在所有值類型的基類system.ValueType中重寫了該方法,用來比較值相等。我們也可以重寫該方法,定義自己的比較相等的規則

GetHashCode:獲取對象的哈希碼(一種通過演算法算出的表示對象的唯一編碼,不同對象哈希碼有可能一樣,具體值根據哈希演算法決定)
我們可以通過重寫該函數來自己定義對象的哈希碼演算法,正常情況下,我們使用的極少,基本不用

ToString:返回當前對象代表的字元串
調用列印方法Console.WriteLine()時,預設使用的就是對象的Tostring方法後列印出來的內容

3 string

3.1 字元串指定位置獲取

//字元串本質是char數組
string str = "abc";
Console.WriteLine(str[0]);//a
//轉為char數組
char[] chars = str.ToCharArray();
Console.WriteLine(chars[1]);//b

3.2 字元串拼接

str = string.Format("{0}{1}", 1, 23);
Console.WriteLine(str);//123

3.3 正向查找字元串的第一個出現位置

str = "abccdefg";
Console.WriteLine(str.IndexOf("c"));//2 返回下標,從0開始
Console.WriteLine(str.IndexOf("h"));//未找到則返回-1

3.4 反向查找字元串的第一個出現位置

Console.WriteLine(str.LastIndexOf("c"));//3

3.5 移除指定位置及之後的字元

  • string 是特殊的引用,特殊的地方在於會在堆中重新分配空間,因此它變我不變,需要賦值來改變內容
str = "abcdefghi";
str.Remove(6);//返回移除後的字元串,並沒有改變原字元串
Console.WriteLine(str);//abcdefghi
str = str.Remove(6);
Console.WriteLine(str);//abcdef

str = str.Remove(4, 2);//兩個參數,分別表示開始位置和字元個數
Console.WriteLine(str);//abcd

3.6 替換指定字元串

str = "abcdefg";
str.Replace("a", "b");
Console.WriteLine(str);//abcdefg
str = str.Replace("a", "b");
Console.WriteLine(str);//bbcdefg

3.7 大小寫轉換

str = "abcdefg";
str.ToUpper();
Console.WriteLine(str);//abcdefg
str = str.ToUpper();
Console.WriteLine(str);//ABCDEFG
str = str.ToLower();
Console.WriteLine(str);//abcdefg

3.8 字元串截取

str = "abcdefg";
//截取指定位置及之後的字元串
str.Substring(2);
Console.WriteLine(str);//abcdefg
str = str.Substring(2);
Console.WriteLine(str);//cdefg

//截取指定位置及之後3個字元
str = str.Substring(2, 3);
Console.WriteLine(str);//efg

3.9 字元串切割

str = "1,2,3,4,5,6,7,8";
string[] strs = str.Split(',');//基於傳入參數將字元串拆分成多個子字元串
foreach(string s in strs)
{
    Console.WriteLine(s);//1 2 3 4 5 6 7 8
}

4 stringBulider

4.1 基本概念

  • 在頻繁對string重新賦值時會產生記憶體垃圾,C#提供stringBulider用於處理字元串的公共類,可以提升性能
  • 在使用 StringBuilder 類時,每次都會對 StringBuilder 對象本身進行操作,而不是生成新的對象,如果需要經常對字元串進行修改推薦使用
  • 使用前需要 using System.Text
StringBuilder str = new StringBuilder("123456");
Console.WriteLine(str);

4.2 容量

  • StringBuilder 的容量一般比字元串多,每次往字元串里增加時,會存在空的容量裡面
  • 如果插入後大於容量,則會自動申請新的記憶體空間,容量大小*2(看記憶體機制),原本的字元串會變成垃圾
Console.WriteLine(str.Length);//6
Console.WriteLine(str.Capacity);//16
//增
str.Append("789");
Console.WriteLine(str);//123456789
Console.WriteLine(str.Length);//9
Console.WriteLine(str.Capacity);//16
//插入
str.Insert(0, "123456789");
Console.WriteLine(str);//123456789123456789
Console.WriteLine(str.Length);//18
Console.WriteLine(str.Capacity);//25 自動申請新的記憶體空間
//刪
str.Remove(0, 3);
Console.WriteLine(str);//456789123456789
//查
Console.WriteLine(str[0]);//4
//改
str[0] = 'X';
Console.WriteLine(str);//X56789123456789
//替換
str.Replace("X", "T");
Console.WriteLine(str);//X56789123456789
//清空
str.Clear();
Console.WriteLine(str);//空

//重新賦值 StringBuilder,這種方法可以避免產生記憶體垃圾
str.Clear();
str.Append("987654321");
Console.WriteLine(str);//987654321

//判斷相等
if (str.Equals("987654321"))//不相等
{
    Console.WriteLine("相等");
}
else
{
    Console.WriteLine("不相等");
}

5 結構體和類的區別

5.1 區別概述

結構體和類最大的區別是在存儲空間上的,因為結構體是值,類是引用,因此他們的存儲位置一個在棧上,一個在堆上。

  • 結構體和類在使用上很類似,結構體甚至可以用面向對象的思想來形容一類對象。
  • 結構體具備著面向對象思想中封裝的特性,但是它不具備繼承和多態的特性,因此大大減少了它的使用頻率。
  • 由於結構體不具備繼承的特性,所以它不能夠使用protected保護訪問修飾符。

5.2 細節區別

  1. 結構體是值類型,類是引用類型
  2. 結構體存在棧中,類存在堆中
  3. 結構體成員不能使用protected訪問修飾符,而類可以
  4. 結構體成員變數申明不能指定初始值,而類可以
  5. 結構體不能申明無參的構造函數,而類可以
  6. 結構體申明有參構造函數後,無參構造不會被頂掉
  7. 結構體不能申明析構函數,而類可以
  8. 結構體不能被繼承,而類可以
  9. 結構體需要在構造函數中初始化所有成員變數,而類隨意
  10. 結構體不能被靜static修飾 (不存在靜態結構體) ,而類可以
  11. 結構體不能在自己內部申明和自已一樣的結構體變數,而類可以

5.3 結構體的特別之處

結構體可以繼承介面,因為介面是行為的抽象。

5.4 如何選擇結構體和類

  • 想要用繼承和多態時,直接淘汰結構體,比如玩家、怪物等
  • 對象時數據集合時,優先考慮結構體,比如位置、坐標等
  • 從值類型和引用類型賦值時的區別上去考慮,比如經常被賦值傳遞的對象,並且改變賦值對象,原對象不想跟著變化時,就用結構體。比如坐標、向量、旋轉等等

6 抽象類和介面的區別

6.1 回顧

抽象類和抽象方法:

  • abstract修飾的類和方法
  • 抽象類 不能實例化
  • 抽象方法只能在抽象類中申明 是個純虛方法 必須在子類中實現

介面:

  • interface 自定義類型
  • 是行為的抽象
  • 不包含成員變數
  • 僅包含方法、屬性、索引器、事件,成員都不能實現,建議不寫訪問修飾符,預設public

6.2 相同點

  1. 都可以被繼承
  2. 都不能直接實例化
  3. 都可以包含方法申明
  4. 子類必須實現未實現的方法
  5. 都遵循里氏替換原則

6.3 不同點

  1. 抽象類中可以有構造函數;介面中不能
  2. 抽象類只能被單一繼承,介面可以被繼承多個
  3. 抽象類中可以有成員變數;介面中不能
  4. 抽象類中可以申明成員方法,虛方法,抽象方法,靜態方法;介面中只能申明沒有實現的抽象方法
  5. 抽象類方法可以使用訪問修飾符;介面中建議不寫,預設public

6.4 如何選擇抽象類和介面

  • 表示對象的用抽象類,表示行為拓展的用介面
  • 不同對象擁有的共同行為,我們往往可以使用介面來實現
  • 舉個例子:動物是一類對象,我們自然會選擇抽象類;而飛翔是一個行為,我們自然會選擇介面

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

-Advertisement-
Play Games
更多相關文章
  • 什麼是Base64 Base64編碼是將字元串以每3個8比特(bit)的位元組子序列拆分成4個6比特(bit)的位元組(6比特有效位元組,最左邊兩個永遠為0,其實也是8比特的位元組)子序列,再將得到的子序列查找Base64的編碼索引表,得到對應的字元拼接成新的字元串的一種編碼方式。 每個3位8比特數據拆分成 ...
  • 藍橋杯【答疑】 題目描述 分析 這是一個貪心演算法,要所得的時刻之和最小,而且下一個同學需要等上一個同學結束以後才能進行,因此需要對所耗總時間進行有小到大的排序,總時間相同的同學則對前兩步時間之和有小到大進行排序,最後算出時間之和即可。 代碼 import java.util.Arrays; impo ...
  • 附件用的fastdf上傳和下載的, 本地開發時就沒考慮過多文件上傳就會有併發的問題,比如多個只上傳成功了一個或者上傳了但是文檔內容缺失了,變成0位元組。 呵。。都是一次難忘的經歷。 經過本地模擬大批量的上傳下載, 發現fastdf是在啟動時就初始化了tracker和stroge, 每次調用過他的介面後 ...
  • 一、Jx9 虛擬機的生命周期 載入 Jx9 腳本 jx9_compile() 或 jx9_compile_file(),載入編譯成功後,Jx9 引擎將自動創建一個實例 (jx9_vm) 並且返回指向此虛擬機的指針用於後續調用。 如載入編譯 Jx9 腳本時出現問題,也就是編譯時出錯,可調用jx9_co ...
  • 生產環境,一個簡單的事務方法,提交失敗,報 Global lock wait timeout 偽代碼如下: @GlobalTransactional(rollbackFor = Exception.class,timeoutMills = 30000,lockRetryInternal=3000,l ...
  • PowerPlume是PowerBuilder深度創新的擴展開發框架(免費商用)。 它的三個主要特色是一、原創功能;二、零改動相容(非侵入性);三、極簡介面設計。 ...
  • 記錄人生第一次重裝系統之後的數據恢復過程,包括桌面恢復、常用軟體下載和屬性修改、vscode插件、zotero數據恢復、onenote筆記數據恢復,讓重裝系統的你不用慌。 ...
  • 發文原因 很多初學者都使用 cargo new [project_name] 來創建項目,並直接在 main.rs 文件中實現所有功能。 這樣是不合理的,並不符合我們 cargo 的開發規範。 下麵將簡單的介紹一下 rust project 中的文件結構。 cargo new [project_na ...
一周排行
    -Advertisement-
    Play Games
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...