文章目錄
- 一、解決方案與項目
- 1. Solution 與 project
- 二、類與名稱空間
- 1.類與名稱空間
- 2.類庫的引用
- 1. DLL引用(黑盒引用,無源代碼)
- 2. Nuget 引用
- 3. 項目引用(白盒引用,有源代碼)
- 3.依賴關系
- 三、類,對象,類成員
- 1.類(class)是現實世界事物的模型
- 2.類與對象的關系
- 2.1 概念
- 2.2 代碼
- 3. 類的三大成員
- 3.1 概念
- 3.2 代碼
- 4.類的靜態成員與實例成員
- 四、語言基本元素概覽
- 1、構成C#語言的基本元素
- 2、初識類型、變量和方法
- 3、算法簡介
- 五、類型,變量與對象
- 1.什么是類型
- 2.類型在C#語言中的作用
- 3. C# 語言的類型系統
- 4.變量、對象與內存
- 六 、方法的定義,調用,調試
- 1、方法的由來
- 2、方法的聲明與調用
- 3. 構造器
- 4. 方法的重載(Overload)
- 4.1調用重載方法的示例
- 4.2 聲明帶有重載的方法
- 5、 如何對方法進行debug
一、解決方案與項目
1. Solution 與 project
在 C# 編程里,Solution(解決方案)和 Project(項目)是兩個重要的概念,它們是組織代碼的基礎。
-
Solution(解決方案)
這是一個容器,其作用是管理多個相關的項目。它不會包含實際的代碼,主要用于保存項目的配置信息以及項目間的依賴關系。在 Visual Studio 中,解決方案的文件擴展名為 .sln。主要功能:
- 對多個項目進行組織和管理,像一個應用程序可能由 Web 項目、類庫項目、測試項目等共同組成。
- 對項目間的引用關系進行定義,例如 Web 項目會引用類庫項目。
- 對全局設置進行配置,比如版本控制、編譯順序等。
-
Project(項目)
項目是代碼的實際載體,它定義了編譯單元,并且會生成輸出文件,像 .exe 或者 .dll 等。每個項目都有自己獨立的配置文件(.csproj)。
常見的項目類型:
- 控制臺應用程序(Console App):生成 .exe 文件,可直接運行。
- 類庫(Class Library):生成 .dll 文件,用于被其他項目引用。
- ASP.NET Web 應用程序:用于構建網站或者 API 服務。
- 單元測試項目:用于編寫測試代碼。
Visual Studio 下面的解決方案圖
二、類與名稱空間
1.類與名稱空間
類(class)
類 (class) 是最基礎的 C# 類型。類是一個數據結構,將狀態(字段)和操作(方法和其他函數成員)組合在一個單元中。類為動態創建的類實例 (instance) 提供了定義,實例也稱為對象 (object)。類支持繼承 (inheritance) 和多態性 (polymorphism),這是派生類 (derived class) 可用來擴展和專用化基類 (base class) 的機制。
名稱空間(namespace)
名稱空間是一種組織機制,用于對代碼進行邏輯分組,避免命名沖突,提升代碼的可維護性。它就像是一個容器,能包含類、接口、結構體等類型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace HelloWorld
{class Program{static void Main(string[] args){Console.WriteLine("Hello World");System.Console.WriteLine("Hello World");}}
}
- HelloWorld , System 則為名稱空間
- Program,Console 則為類
- WriteLine 為方法
2.類庫的引用
類庫引用是使用名稱空間的物理基礎
1. DLL引用(黑盒引用,無源代碼)
使用 FastReport 里面的方法
namespace HelloWorld
{class Program{static void Main(string[] args){FastReport.BandBase.GetData();}}
}
2. Nuget 引用
注意:
-
NuGet 管理器 有可能 一直在加載中,什么都沒顯示出來:
- 解決: visual Studio -> 工具 -> 擴展與更新,直接卸載重裝 NuGet 即可。
- 解決: visual Studio -> 工具 -> 擴展與更新,直接卸載重裝 NuGet 即可。
-
下面是注冊表解決,不能確定這個可行:
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64 reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64
3. 項目引用(白盒引用,有源代碼)
添加本地的類庫:
調用測試:
namespace HelloWorld
{class Program{static void Main(string[] args){int c = MyLibrary.Arithmetic.add(5,10);System.Console.WriteLine(c);}}
}
3.依賴關系
- 類(或對象)之間的耦合關系
- 優秀的程序追求“高內聚,低耦合
- UML(通用建模語言)類圖
三、類,對象,類成員
1.類(class)是現實世界事物的模型
- 類是對現實世界事物進行抽象所得到的結果
- 事物包括“物質”( 實體)與“運動"( 邏輯)
- 建模是一個去偽存真、由表及里的過程
2.類與對象的關系
2.1 概念
-
對象也叫實例,是類經過“實例化”后得到的內存中的實體
- Formally “instance"is synonymous with“object”–對象和實例是一回事
- “飛機"與”一架飛機"有何區別?天上有(一架)飛機一-必需是實例飛,概念是不能飛的
- 有些類是不能實例化的,比如“數學”( Math class),我們不能說”一個數學”
-
依照類,我們可以創建對象,這就是“實例化”
-
現實世界中常稱“對象”,程序世界中常稱“實例"
-
二者并無太大區別,常常混用,初學者不必迷惑
-
-
使用new操作符創建類的實例
-
引用變量與實例的關系
- 孩子與氣球
- 氣球不一定有孩子牽著
- 多個孩子可以使用各自的繩子牽著同一個氣球,也可以都通過一根繩子牽著氣球
2.2 代碼
new 實例化類,設置實例屬性,以及多個變量用一個實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace ClassAndInstance
{class Program{static void Main(string[] args){//(new Form()).Text = "my form";//(new Form()).ShowDialog();//Form myForm = new Form();//myForm.Text = "my form";//myForm.ShowDialog();Form myForm1 = new Form();Form myForm2 = myForm1;myForm1.Text = "my form11";myForm2.Text = "my form22";myForm2.ShowDialog();}}
}
3. 類的三大成員
3.1 概念
- 屬性(Property)
- 存儲數據,組合起來表示類或對象當前的狀態
- 方法(Method )
- 由C語言中的函數(function)進化而來,表示類或對象“能做什么”
- 工作中90%的時間是在與方法打交道,因為它是“真正做事”、“構成邏輯”的成員
- 事件(Event )
- 類或對象通知其它類或對象的機制,為C#所特有(Java通過其它辦法實現這個機制)
- 善用事件機制非常重要
- 使用MSDN文檔
- 某些特殊類或對象在成員方面側重點不同
- 模型類或對象重在屬性,如Entity Framework
- 工具類或對象重在方法,如Math ,Console
- 通知類或對象重在事件,如各種Timer
3.2 代碼
1、打印數據表數據,屬性類的實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace PropertySample
{class Program{static void Main(string[] args){test2024Entities proxy = new test2024Entities();foreach(tbPlmBcMaterData p in proxy.tbPlmBcMaterDatas){Console.WriteLine(p.MaterialCode);}Console.WriteLine(proxy.tbPlmBcMaterDatas.Count());}}
}
添加數據模型:
調試打印數據列表,總數
2、事件類代碼例子
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;namespace EventSample
{/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DispatcherTimer timer = new DispatcherTimer();timer.Interval = TimeSpan.FromSeconds(1);timer.Tick += timer_Tick;timer.Start();}void timer_Tick(object sender, EventArgs e){this.timeTextbox.Text = DateTime.Now.ToString();}}
}
時間秒在跳動
4.類的靜態成員與實例成員
-
靜態(Static)成員在語義上表示它是“類的成員”
-
實例(非靜態)成員在語義表示它是“對象的成員”
-
綁定( Binding)指的是編譯器如果把一個成員與類或對象關聯起來
- 不可小覷的"“操作符–成員訪問
四、語言基本元素概覽
1、構成C#語言的基本元素
-
關鍵字(Keyword )
- C# 編程語言中,關鍵字是被編譯器預定義并保留的標識符,具有特殊意義,不能用作變量名或其他標識符
- C# 編程語言中,關鍵字是被編譯器預定義并保留的標識符,具有特殊意義,不能用作變量名或其他標識符
-
操作符(Operator)
- C# 提供大量運算符,這些運算符是指定在表達式中執行哪些操作的符號。
-
標識符(ldentifier )
- 什么是合法的標識符
- 怎樣閱讀語言定義文檔
- 大小寫規范
- 命名規范
-
標點符號
-
文本(字面值)
- 整數
- 多種后綴
- 實數
- 多種后綴
- 字符
- 字符串
- 布爾
- 空(null )
-
注釋與空白
- 單行
- 多行(塊注釋)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace identifiterSample
{class Program{static void Main(string[] args){int a = 100;long aa = 100;double b = 3.1;char c = 'a';string cc = "asdasas";bool dd = true;Console.WriteLine(dd.GetType().Name);Console.WriteLine(dd);}}
}
2、初識類型、變量和方法
- 初識類型(Type)
- 亦稱數據類型(Data Type)
- 變量是存放數據的地方,簡稱“數據"
- 變量的聲明
- 變量的使用
- 方法(日稱函數)是處理數據的邏輯,又稱“算法"
- 方法的聲明
- 方法的調用
- 程序=數據+算法
- 有了變量和方法就可以寫有意義的程序了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace identifiterSample
{class Program{static void Main(string[] args){Calculate cal = new Calculate();int calRes = cal.Add(10, 5);Console.WriteLine("計算結果是:" + calRes);Console.WriteLine(cal.day());cal.printRes(11, 12);}}class Calculate{public int Add(int a, int b){return a + b;}public string day(){string aa = DateTime.Now.Year.ToString();return aa;}public void printRes(int a, int b){Console.WriteLine(a+b); }}
}
3、算法簡介
- 循環初體驗
- 遞歸初體驗
- 計算1到100的和
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace identifiterSample
{class Program{static void Main(string[] args){Calculate cal = new Calculate();Console.WriteLine(cal.countXto1(100));Console.WriteLine(cal.countXto1ByTT(100));}}class Calculate{public int countXto1(int x){int sum = 0;for (int i = 0; i <= x; i++){sum = sum + i;}return sum;}public int countXto1ByTT(int x){if(x ==1){return 1;}else{return x + countXto1ByTT(x - 1);}}}
}
五、類型,變量與對象
1.什么是類型
- 又名數據類型( Data Type )
- 是數據在內存中存儲時的“型號”
- 小內存容納大尺寸數據會丟失精確度、發生錯誤
- 大內存容納小尺寸數據會導致浪費編程語言的數據類型與數據的數據類型不完全相同
2.類型在C#語言中的作用
- 一個C#類型中所包含的信息有
- 存儲此類型變量所需的內存空間大小
- 此類型的值可表示的最大、最小值范圍
- 此類型所包含的成員(如方法、屬性、事件等)
- 此類型由何基類派生而來
- 程序運行的時候,此類型的變量在分配在內存的什么位置
- Stack簡介
- Stack overflow
- Heap簡介
- 使用Performance Monitor查看進程的堆內存使用量
- 關于內存泄漏
- 此類型所允許的操作(運算)
3. C# 語言的類型系統
- C#的五大數據類型
- 類(Classes):如Window, Form, Console, String
- 結構體(Stmuctures):如Int32,Int64,Single, Double
- 枚舉(Enumerations):如HorizontalAlignment, Visibility
- 接口(Interfaces)
- 委托(Delegates
- C#類型的派生譜系
4.變量、對象與內存
-
什么是變量
- 表面上來看(從C#代碼的上下文行文上來看),變量的用途是存儲數據
- 實際上,變量表示了存儲位置,并且每個變量都有一個類型,以決定什么樣的值能夠存入變量
- 變量一共有7種
- 靜態變量,實例變量(成員變量,字段),數組元素,值參數,引用參數,輸出形參,局部變量
- 狹義的變量指局部變量,因為其它種類的變量都有自己的約定名稱
- 簡單地講,局部變量就是方法體(函數體)里聲明的變量
- 變量的聲明
- 有效的修飾符組合。 類型 變量名 初始化器。.
-
值類型的變量
- 以byte/sbtye/short/ushort為例
- 值類型沒有實例,所謂的“實例"與變量合而為一
-
引用類型的變量與實例
- 引用類型變量與實例的關系:引用類型變量里存儲的數據是對象的內存地址
-
變量的默認值
-
常量(值不可改變的變量)
-
裝箱與拆箱(Boxing & Unboxing )
六 、方法的定義,調用,調試
1、方法的由來
- 方法(method)的前身是C/C++語言的函數(function)
- 方法是面向對象范疇的概念,在非面向對象語言中仍然稱為函數
- 使用C/C++語言做對比
- 永遠都是類(或結構體)的成員
- C#語言中函數不可能獨立于類(或結構體)之外
- 只有作為類(結構體)的成員時才被稱為方法
- C++中是可以的,稱為“全局函數”
- 是類(或結構體)最基本的成員之
- 最基本的成員只有兩個–字段與方法(成員變量與成員方法),本質還是數據+算法
- 方法表示類(或結構體)“能做什么事情”
- 為什么需要方法和函數
- 目的1:隱藏復雜的邏輯
- 目的2:復用(reuse,重用)
示例: 計算圓面積、圓柱體積、圓錐體積
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpMethodExample
{class Program{static void Main(string[] args){Calculator cal = new Calculator();double cc = cal.GetConeVolume(10,15);Console.WriteLine(cc);}}class Calculator{//計算圓面積public double GetCirceArea(double r){return Math.PI * r * r;}//計算圓柱體積public double GetCylinderVolume(double r, double h){return GetCirceArea(r) * h;}//計算圓錐體積public double GetConeVolume(double r, double h){return GetCylinderVolume(r, h) / 3;}}
}
2、方法的聲明與調用
-
聲明方法的語法詳解
- “方法”是包含一系列語句的代碼塊。 程序通過“調用”方法并指定所需的任何方法參數來執行語句。
- 在 C# 中,每個執行指令都是在方法的上下文中執行的。
- Main 方法是每個 C# 應用程序的入口點,在啟動程序時由公共語言運行時 (CLR) 調用。
- Parameter全稱為"formal parameter形式上的參數,簡稱“形參”
- Parameter是一種變量
-
方法簽名
- 通過指定方法的訪問級別(例如 public 或 private)、可選修飾符(例如 abstract 或 sealed)、返回值、名稱和任何方法參數,可以在 類或 結構中聲明方法。 這些部分統稱為方法的“簽名”。
-
方法的命名規范
- 大小寫規范
- 需要以動詞或者動詞短語作為名字
-
重溫靜態(static)方法和實例方法
-
調用方法
- 在對象上調用方法類似于訪問字段。 在對象名稱之后,依次添加句點、方法名稱和括號。 參數在括號內列出,并用逗號隔開。
- Argument中文C#文檔的官方譯法為“實際參數”,簡稱“實參”可理解為調用方法時的真實條件
- 調用方法時的argument列表要與定義方法時的parameter列表相匹配C#是強類型語言,arqument是值、parameter是變量,值與變量一定要匹配,不然編譯器會報錯
3. 構造器
- 構造器(constructor)是類的成員之一
- 任何時候,只要創建 類或 結構,就會調用它的構造函數。
- 類或結構可能有多個接受不同參數的構造函數。
- 構造函數使得程序員可設置默認值、限制實例化以及編寫靈活且便于閱讀的代碼。
- 如果您沒有為對象提供構造函數,則默認情況下 C# 將創建一個構造函數,該構造函數實例化對象,并將成員變量設置為 默認值表(C# 參考)中列出的默認值。
- 靜態類和結構也可以有構造函數。
默認構造函數實例:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpMethodExample
{class Program{static void Main(string[] args){//沒有為對象提供構造函數,則默認情況下 C# 將創建一個構造函數,該構造函數實例化對象,并將成員變量設置為 默認值表(C# 參考)中列出的默認值Student stu = new Student();Console.WriteLine(stu.ID);}}class Student{public int ID;public string Name;}
}
類或結構可能有多個接受不同參數的構造函數實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpMethodExample
{class Program{static void Main(string[] args){Student stu = new Student(11,"測試");Console.WriteLine(stu.Name);Student stuTwo = new Student();Console.WriteLine(stuTwo.Name);}}class Student{public Student(int ID,string Name){this.ID = ID;this.Name = Name;}public Student(){this.ID = 1;this.Name = "測試111";}public int ID;public string Name;}
}
構造器的內存原理
4. 方法的重載(Overload)
4.1調用重載方法的示例
Console.WriteLine(100);
Console.WriteLine(100L);
Console.WriteLine("Hello");
Console.WriteLine(300D);
Console.WriteLine 有 19個重載
4.2 聲明帶有重載的方法
-
方法簽名(method signature)由方法的名稱、類型形參的個數和它的每一個形參(按從左到右的順序)的類型和種類(值、引用或輸出)組成。方法簽名不包含返回類型。
-
實例構造函數簽名由它的每一個形參(按從左到右的順序)的類型和種類(值、引用或輸出)組成。
-
重載決策(到底調用哪一個重載):用于在給定了參數列表和一組候選函數成員的情況下,選擇一個最佳函數成員來實施調用。
方法簽名不同的重載實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace OverloadDemo
{class Program{static void Main(string[] args){Calculator cal = new Calculator();Console.WriteLine(cal.Add(1, 2));Console.WriteLine(cal.Add(1.1, 2.5));Console.WriteLine(cal.Add(11, 33, 55));}}class Calculator{public int Add(int a, int b){return a + b;}public int Add(int a, int b, int c){return a + b + c;}public double Add(double a, double b){return a + b;}}
}
5、 如何對方法進行debug
- 設置斷點
- 觀察方法調用時的 call stack
- Step-in(F11) Step-over(F10) Steep-out (shift+F11)
- 觀察局部變量的值與變化