一、介紹css
.net通常指.Net Framework框架。一種平臺,一種技術。html
C#是一種編程語言,能夠開發基於.net平臺的應用。web
.Net Framework是框架是.Net平臺不可缺乏的一部分,它提供了一個穩定的環境來保證咱們基於.Net平臺開發的各類應用可以正常的運轉。正則表達式
二、兩種交互模式編程
C/S:要求客戶的電腦上必須裝一個客戶端:QQ、360、快播等。。。windows
B/S:要求客戶的電腦上只須要裝一個瀏覽器。api
三、VS的學習數組
1.啓動VS瀏覽器
a.雙擊圖標安全
b.調出cmd,輸入devenv
2.VS的設置
主題:工具 - 選項 - 環境 - 常規 - 顏色主題
字體:工具 - 選項 - 環境 - 字體和顏色 - 字體(Consolas)推薦
顯示行號:工具 - 選項 - 環境 - 文本編輯器 - C# - 行號
還原默認設置:工具 - 導入和導出設置 - 重置全部設置 - 下一步
建立解決方案:文件 - 新建 - 項目 - Visual C# - windows - 程序
顯示解決方案資源管理器:視圖 - 解決方案資源管理器
添加項目:解決方案資源管理器 - 解決方案項目 - 添加 - 新建項目
切換項目:解決方案資源管理器 - 解決方案項目 - 屬性 - 通用屬性 - 啓動項目 - 但啓動項目修改爲當前選中內容
3.VS生成的文件
.sln:解決方案文件,裏面包含整個解決方案的信息,能夠雙擊運行
.csproj:項目文件,裏面包含着整個項目的信息,能夠雙擊運行
.config:配置文件
.cs:類文件
四、引用命名空間
淘寶 --> 淘寶在線商城項目 --> 顧客類
using 淘寶 --> 淘寶在線商城項目
五、方法或者函數
Main函數是咱們程序的入口,你寫的代碼若是想被執行的話,必須寫在Main函數當中
六、代碼書寫須要注意的地方
1.代碼中出現的全部標點都是英文半角 Shift鍵 快速切換中文半角和英文半角 Shift鍵+空格 切換全腳和半角
2.在C#代碼中,每行代碼的結束,咱們都以分號結束,注意:這個分號是英文半角的分號
3.Console.WriteLine("要打印的內容");
Console.ReadKey(); //暫停當前程序,等待用戶按下任意鍵繼續,按下的任意鍵將顯示在咱們的控制檯當中
4.解決方案下面的項目不容許重命名,在面向對應調用項目會有影響,可直接移除添加新項目
七、C#中的三種註釋符
1.單行註釋 //
2.多行註釋 /*要註釋的內容*/
3.文檔註釋 ///
八、VS中經常使用的快捷鍵
Ctrl + K + D 快速對齊代碼
Ctrl + Z 撤銷
Ctrl + S 保存(必定要常常保存)
Ctrl + J 彈出智能提示
Shift + Home Shift + End
Ctrl + K + C 註釋所選代碼
Ctrl + K + U 取消所選代碼的註釋
Alt + Shift + F10 導入命名空間
F1 轉到幫助文檔
F6 生成解決方案(檢查代碼是否有錯誤)
F5 運行代碼
摺疊冗餘代碼 #region 和#endregion
快速摺疊代碼 選中->右鍵->外側代碼->#region
Ctrl + F5 測試代碼
Ctrl + Shift + B 編譯修改代碼,刷新頁面
F2 快速複製
九、變量
存儲變量的語法:
變量類型 變量名
變量名=值
"="號:表明賦值的意思,表示把等號右邊的值賦值給等號左邊的變量
聲明而且給變量賦值的簡寫形式:
變量類型 變量名 = 值
十、數據類型
1.整數類型:int 只能存儲整數,不能存儲小數
2.小數類型:double 既能存儲整數,也能存儲小數,小數點後面的位數15~16位
3.金錢類型:decimal 用來存儲金錢,值後面須要加一個m
4.字符串類型:stirng 用來存儲多個文本,也能夠存儲空
5.字符類型:char 用來存儲單個字符,最多、最少只能有一個字符,不能存儲空。
十一、命名規則
1.首先要保證變量的名字要有意義
2.必須以字母、下劃線、@符號開頭,不能以數字開頭
注意:
1.你起的變量名不要與C#中的關鍵字重複
2.C#中的大小寫是敏感的
3.同一個變量不容許重複定義
給變量命名要知足兩個命名規則:
1.Camel 駱駝命名規範。要求變量名的首單詞的首字母要小寫,其他每一個單詞的首字母要大寫。多用於給變量命名(highSchoolStudent)
2.Pascal 命名規範。要求每一個單詞的首字母要大寫,其他字母小寫。多用於給類和方法命名(HighSchoolStudent)
十二、+號的做用
1.鏈接:當+號兩邊有一邊是字符串的時候,+號就起到了鏈接的做用
2.相加:兩邊是數字的時候
1三、佔位符的使用
使用方法:先挖個坑,再填個坑。
使用佔位符須要注意幾個地方:
一、你挖了幾個坑,就應該填幾個坑,若是多填了沒有效果,少填了拋異常。
二、輸出順序:按照挖坑的順序進行輸出
{0:00}表示保留小數點後兩位
1四、異常
異常是指:語法上沒有任何錯誤,只不過在程序運行的期間,因爲某些緣由出現了問題,使程序不能正常的運行
1五、轉義符
轉義符指的就是一個'\'加一個特殊的字符,組成一個特殊意義的字符
\n:表示換行
\":表示一個英文半角的雙引號
\t:表示一個tab鍵的空格
\b:表示一個退格鍵,放在字符的兩邊沒有效果
\r\n:windows系統不認識\n,只認識\r\n
\\:表示一個\
1六、@符號
1.取消\在字符串中的轉義做用
2.將字符串按照原格式輸出
1七、算術運算符
+ - * / %
1八、類型轉換
隱式類型轉換:
咱們要求等號兩邊參與運算的操做數的類型必須一致,若是不一致,知足下列條件會發生自動類型轉換,或者稱之爲隱式類型轉換
兩種類型兼容
例如:int和double兼容(都是數字類型)
目標類型大於原類型
例如:double > int 小的轉大的
顯示類型轉換:
1.兩種類型相兼容 int --> double
2.大的轉小的 double --> (int)
語法
(待轉換的類型)要轉換的值
1九、Convert類型轉換
string str = "123";
int i = Convert.ToInt32(str);
20、算術運算符
++:分爲前++和後++,無論是前++仍是後++,最終結果都是變量加1
若是是前++,帶着這個值+1去參與運算,若是是後++,先用原值去參與運算,運算完後再+1
--:同上
一元運算符和二元運算符:
對於像++或者--只須要一個操做符就能夠完成的運算,咱們稱之爲一元運算符
+ - * / %須要兩個或者兩個以上完成運算的操做符,咱們稱之爲二元運算符
一元運算符的優先級要高於二元運算符
若是在一個表達式中,有一元運算符和二元運算符,我先計算一元運算符
int number = 10;
int result = + ++number;
2一、bool類型
在C#中咱們用bool類型來描述對或者錯
bool類型有兩個,一個true,一個false
2二、邏輯運算符
&& 邏輯與
| | 邏輯或
! 邏輯非
邏輯運算符鏈接的表達式叫邏輯表達式
判斷閏年:
bool b = year % 400 == 0 || year % 4 == 0 && year % 100 != 0; //邏輯與的優先級要高於邏輯或
建議加括號:
bool b = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
2三、複合賦值運算符
+=:number = number + 數 -=:number = number - 數
*=:number = number * 數 /=:number = number / 數
%=:number = number % 數
2四、結構
順序結構:程序從Main函數進入,從上到下一行一行的執行,不會落下任何一行
分支結構:if if-else
選擇結構:if if-else switch-case
循環結構:while do-while for foreach
2五、if語句
if(判斷條件){
要執行的代碼;
}
注意:
判斷條件中 ==true能夠省略,==false不能省略
2六、if-else
if(判斷條件){
執行的代碼;
}
else{
執行的代碼;
}
2七、if else-if
if(判斷條件){
執行的代碼;
}
else if{
執行的代碼;
}
...
else{
執行的代碼;
}
注意:
else能夠省略
2八、異常捕獲
咱們程序中常常會出現各類各樣的異常,若是你想要你的程序變的更堅強一些,在你的代碼中應該常用try-catch來進行異常捕獲。
哪行代碼出現異常,你就踹它一腳
語法:
try{
可能會出現異常的代碼;
...
}
//try和catch之間不能有其餘的代碼
catch{
出現異常後要執行的代碼;
}
2九、變量的做用域
變量的做用域就是你可以使用這個變量的範圍。
變量的做用域通常從聲明它的那個括號開始到對應括號的結束,在這個範圍內咱們能夠訪問並使用變量,超過這個範圍就訪問不到了。
30、捕捉異常的實例
bool b = true;
int number = 0;
Console.WriteLine("請輸入一個數字");
try{
number = Convert.ToInt32(Console.ReadLine());
}
catch{
Console.WriteLine("輸入的內容不能轉換爲數字");
b = false;
}
if(b){
Console.WriteLine(number*2);
}
Console.ReadKey();
3一、switch-case
switch(變量或者表達式的值){
case 值1:要執行的代碼
break;
case 值2:要執行的代碼
break;
...
default :要執行的代碼
break;
}
注意:
1.若是有default,則執行default中的語句,若是沒有default,則switch-case結構什麼都不作
2.case中執行的代碼若是同樣,能夠省略不寫
3二、while循環
while(循環條件){
循環體;
}
特色:先判斷後執行,有可能一遍循環都不執行
最簡單的最經常使用的死循環:
while(true){
}
3三、break
1.能夠跳出switch-case結構
2.能夠跳出當前循環
3.break一遍不單獨使用,而是跟着if判斷一塊兒使用,表示當知足某些條件的時候,就再也不循環了
3四、do-while循環
do{
循環體;
}while(循環條件)
特色:先循環再判斷,最少執行一遍循環體
3五、程序調試
F5:啓動
F9:打斷點
F10:跨過程執行
F11:單步逐句執行
F12:查看方法
打開監視:調試-窗口-監視
3六、for循環
for(表達式1;表達式2;表達式3){
循環體;
}
表達式1通常爲聲明循環變量,記錄循環的次數(int i = 0;)
表達式2通常爲循環條件(i < 10)
表達式3通常爲改變循環條件的代碼,使用循環條件終有一天再也不成立(i++)
注意:
快捷鍵以下:
for + 兩次tab鍵(for循環的代碼段)
forr + 兩次tab鍵(逆向for循環的代碼段)
3七、三元表達式
表達式1:表達式2?表達式3
bool result = 5 > 3 ? true : false;
3八、枚舉
[public] enum 枚舉名{
值1,
值2,
...
}
將字符串轉換成枚舉類型:
(要轉換的枚舉類型)Enum.Parse(typeof(要轉換的枚舉類型),"要轉換的字符串")
全部類型都能轉換成string類型,調用Tostring()。
3九、結構
能夠幫助咱們一次性聲明多個不一樣類型的變量,結構不具有面向對象的任何特徵
[public] struct 結構名{
成員;//字段
}
//變量在程序運行期間只能存儲一個值,而字段能夠存儲多個值
40、數組
一次性存儲多個不一樣類型的變量
數組類型[] 數組名 = new 數組類型[數組長度];
4一、冒泡排序
for (int i = 0; i < nums.Length-1; i++)
{
for (int j = 0; j < nums.Length-1-i; j++)
{
if (nums[j] > nums[j+1])
{
int temp = nums[j];
nums[j] = nums[j+1];
nums[j + 1] = temp;
}
}
}
4二、方法
函數就是一堆代碼進行重用的一種機制
[public] static 返回值類型 方法名 (參數列表){
方法體:
}
方法寫好後,若是想被執行,必須在Main()函數中調用
方法的調用語法:
類名.方法名([參數]);
在某些環境下,類名是能夠省略的,若是你寫的方法跟Main()函數在同一個類中,這個時候類名能夠省略
4三、return
1.在方法中返回要返回的值
2.當即結束本次方法
4四、方法的調用
咱們在Main()函數中,調用Test()函數,咱們管Main()函數稱之爲調用者,管Test()函數稱之爲被調用者
若是被調用者想獲得調用者的值:傳遞參數和使用靜態字段來模擬全局變量
若是調用者想獲得被調用者的值:返回值
4五、方法調用的實例
static void Main(string[] args)
{
int mx = max(10,20);
Console.WriteLine(mx);
Console.ReadKey();
}public static int max(int a,int b)
{
int i = a > b ? a : b;
return i;
}
4六、out、ref、params
1.out參數:Test函數使用out參數返回多個不一樣類型的值給Main函數進行調用
2.ref參數:Main函數中進行賦值,Test函數使用ref調用Main函數中賦的值
3.params可變參數:將實參列表中可變參數數組類型一致的元素都當作數組的類型去處理
注意:params可變參數必須是形參列表中的最後一個元素
4七、方法的重載
方法的重載指的就是方法的名稱相同,可是參數不一樣
1.若是參數的類型相同,參數的個數就不能相同
2.若是參數的個數相同,參數的類型就不能相同
方法的重載跟返回值沒有關係
4八、方法的遞歸
方法本身調用本身
注意:調用時進入死循環,使用static聲明變量
4九、面向對象
找個對象幫你作事兒
例如:把大象塞進冰箱裏,咱們把冰箱做爲對象
1.冰箱門能夠被打開
2.大象能夠被塞進冰箱裏
3.冰箱門能夠關閉
50、類
[public] class 類名{
字段;
屬性;
方法;
}
寫好一個類後,咱們須要建立這個類的對象,那麼咱們管建立這個類的對象過程稱之爲類的實例化,使用關鍵字new
this:表示當前這個類的對象
例如:Person p = new Person() 中 p.屬性 等於 this.屬性
1.類是不佔內存的,而對象是佔內存的
2.當咱們建立好一個類的對象後,須要給這個對象的每一個屬性去賦值,咱們稱之爲類的初始化
5一、屬性
屬性的做用是保護字段、對字段的賦值和取值進行限定
屬性的本質方法有兩個,一個是get(),一個是set()
對屬性進行賦值調用set(),對屬性進行取值調用get()
既有get()也有set()稱之爲可讀可寫屬性
只有get()沒有set()稱之爲只讀屬性
沒有get()只有set()稱之爲只寫屬性
注意:
快速封裝屬性->選中該行右鍵-重構-封裝字段-回車
5二、訪問修飾符
public:公開的公共的,在哪裏均可以訪問
private:私有的,只有在當前類的內部才能訪問,出了這個類就訪問不到了
protected:能夠在當前類的內部以及該類的子類中訪問
Internal:只能在當前項目中訪問。在同一個項目中,在Internal和public的權限是同樣的
可以修飾類的訪問修飾符只有兩個:public和protected
5三、靜態和非靜態的區別
1.靜態成員必須用類名調用,而實例成員使用對象名調用
2.靜態函數中,只能訪問靜態成員,不容許訪問實例成員
3.實例函數中,既能夠訪問靜態成員,也能夠訪問實例成員
靜態類在整個項目中,資源共享
5四、構造函數
幫助咱們初始化對象給每一個屬性賦值
Person(string name,int age){
this.Name = name;
this.Age = age;
}
Person p = new Person("張三",30) //省略了p.屬性
1.構造函數沒有void和返回值
2.構造函數名稱必須和類名同樣
5五、new關鍵字
1.在內存中開闢一塊空間
2.在開闢的空間中建立對象
3.調用對象的構造函數初始化對象
5六、this關鍵字
1.表明當前類的對象
2.在類中顯示的調用本類的構造函數 :this()構析函數
5七、命名空間
能夠認爲類是屬於命名空間的,當項目中沒有這個命名空間須要咱們手動導入這個類的命名空間。
方法:用鼠標點或者alt+shift+F10
5八、在一個項目中引用另外一個項目的類
1.添加引用
2.引用命名空間
5九、值類型和引用類型
值類型咱們稱之爲值的傳遞,引用類型稱之爲引用傳遞
值類型:int、double、bool、char、decimal、struct、enum
引用類型:string、自定義類、數組
值類型存儲在內存的棧中,引用類型存儲在內存的堆中
60、字符串
1.字符串的不可變性,當你給一個字符串從新賦值後,老值並無銷燬,而是從新開闢了一塊空間存儲新值。當程序結束後,GC掃描整個內存,若是發現有的空間沒有被指向就當即把它銷燬
2.咱們能夠將字符串看做一個char類型的只讀的數組
6一、字符串提供的各類方法
1.Length:獲取當前字符串中字符的個數
2.ToUpper():將字符串轉換成大寫形式
3.ToLower():將字符串轉換成小寫形式
4.Equals():比較兩個字符串
5.Split():分割字符串,返回字符串類型的數組
6.Substring():截取字符串
7.IndexOf():判斷某個字符串第一次出現的位置,若是沒有返回-1,有返回1
8.Replace():將字符串中某個字符串替換成一個新的字符串
9.Trim():去掉字符串中先後的空格
10.string.IsNullOrEmpty():判斷一個字符串是否爲空或者null
6二、繼承
1.咱們能夠將一些類中重複的成員,單獨封裝到一個類中做爲父類
2.子類繼承了父類的屬性和方法,但子類沒有繼承父類的私有字段
3.子類沒有繼承父類的構造函數,但子類會默認調用父類的無參構造函數,建立父類對象讓子類成爲父類的成員
6三、new關鍵字
1.建立對象
2.隱藏從父類那裏繼承過來的同名成員,隱藏的後果就是子類調用不到父類的成員
6四、里氏轉換
1.子類能夠賦值給父類
2.若是父類中裝的子類的對象,那麼能夠講這個父類強轉爲子類對象
6五、ArrayList集合
ArrayList list = new ArrayList();
//添加單個元素
list.Add("asd");
list.Add(123);
//添加集合
list.AddRange(new int[] {1,2,3,4,5});
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();//ArrayList的長度問題:每次集合中元素count的個數超過包含元素capcaty的個數,集合會向內存中申請多開闢一倍的空間,來保證集合的長度夠用
6六、foreach循環
int[] nums = { 1, 2, 5, 7, 9, 6, 3 };
foreach (var item in nums)
{
Console.WriteLine(item);
}
Console.ReadKey();//foreach循環比for循環效率高
6七、Var
var在代碼中要有明確的賦值,例如:var a = 0;(正確) var a;(錯誤)
C#是一門強類型語言,須要對每一個變量有明確的定義
JS是一門弱類型語言
6八、編碼格式
ASC 128
ASCII 256
GB2312 簡體字
Big5 繁體字
uncode 編碼全,解析慢
UTF-8 web
產生亂碼的緣由是:保存文件所採用的編碼,跟你打開這麼文件所採用的編碼格式不同
6九、絕對路徑和相對路徑
絕對路徑:經過給定的這個路徑,能在我電腦中找到這個文件
相對路徑:文件相對於應用程序的路徑
結論:咱們在開發中應儘可能去使用相對路徑
70、裝箱、拆箱
裝箱:就是將值類型轉換爲引用類型
拆箱:將引用類型轉換爲值類型
看兩種類型是否發生了裝箱或者拆箱,要看這兩種類型是否存在繼承關係
咱們應該儘可能避免在代碼中發生裝箱和拆箱
7一、泛型
List<int> list = new List<int>();
List和ArrayList區別:肯定了集合中元素的類型,使用集合不會發生裝箱和拆箱的操做
7二、鍵值對
Dictionary<int,string> dic = new Dictionary<int,string>();
dic.Add(1,"張三");
dic[2] = "李四";
foreach(KeyValuePair<int,string> kv in dic){
Console.writeLine("{0}---{1}",kv.Key,kv.Value);
}
7三、多態性
多態是一個類有多種不一樣的表現形式
父類的方法爲虛方法,使用關鍵字viatual,此方法在子類中能夠重寫(使用關鍵字override)
7四、抽象類
1.抽象成員必須標記爲abstract,而且不能有任何實現
2.抽象類不能被實例化
3.若是父類中的方法有默認的實現,而且父類須要被實例化,能夠考慮將父類定義爲一個普通類,用虛方法實現多態
4.若是父類中的方法有默認的實現,而且父類不須要被實例化,能夠將該類定義爲抽象類
7五、序列化和反序列化
1.就是將對象轉換爲二進制
2.就是將二進制轉換爲對象
做用:傳輸數據
序列化:將這個類標記爲能夠被序列化的
7六、接口
1.接口是一種規範,只要一個類繼承了一個接口,這個類就必須實現這個接口中全部的成員
2.接口不能被實例化,也就是說接口不能new(不能建立對象)
3.接口中的成員不能加"訪問修飾符",接口中的成員訪問修飾符爲public,不能修改
4.接口中只能有方法、屬性、索引器、事件,不能有字段和構造函數
5.一個類能夠同時繼承一個類並實現多個接口,若是一個子類同時繼承了父類A,並實現了接口IA,那麼語法上A必須寫在IA前面
Class MyClass:A,IA{},由於類是單繼承的
實現接口的目的:解決方法的重名
7七、GUID
Guid.NewGuid().ToString();
7八、MD5加密
public static string GetMD5(string str)
{
MD5 md5 = MD5.Create();
byte[] buffer = Encoding.Default.GetBytes(str);
byte[] MD5Buffer = md5.ComputeHash(buffer);
//return Encoding.GetEncoding("GBK").GetString(MD5Buffer);
string strNew = "";
for (int i = 0; i < MD5Buffer.Length; i++)
{
strNew += MD5Buffer[i].ToString();
}return strNew;
}
7九、WinForm介紹
winform應用程序是一種智能客戶端技術,咱們可使用winform應用程序幫助咱們得到信息或者傳輸信息等
80、屬性和事件
Name:在後臺得到前臺的控件對象,須要使用Name屬性
Visible:指示一個控件是否可見
Enabled:指示一個控件是否可用
事件:發生一件事情(註冊事件、觸發事件)
8一、Main函數
在Main函數當中建立的窗體對象,咱們稱之爲這個窗體應用程序的主窗體
也就意味着,當你的主窗體關閉後,整個應用程序就關閉了
8二、TextBox控件
WordWrap:指示文本框是否換行
PasswordChar:讓文本框顯示一個單一的字符
ScollBars:是否顯示滾動條
事件:TextChanged 當文本框中內容發生變化時觸發這個事件
8三、Timer定時器
在指定時間的間隔內作一件事
8四、單選和多選
checked:指示這個控件是否處於選中狀態
默認狀況下,在一個窗體中,全部的單選按鈕只容許選中一個,可使用groupbox進行分組
8五、Mdi窗體的設置
1.首先肯定一個父窗體。將IsMdiContainer設置爲true
2.建立子窗體,而且設置它們的父窗體
獲取指定文件的路徑:pictureBox1.Image = Image.FromFile(@"C:\Users\CHD\Desktop\圖片\1.jpg");
獲取文件夾的路徑:string[] path = Directory.GetFiles(@"C:\Users\CHD\Desktop\圖片");
設置圖片在pictureBos中的佈局:picture1.SizeMode = PictureBoxSizeMode.StretchImage;
8六、Directory
Directory 操做文件夾
CreateDirectory 建立文件夾
Delete 刪除文件夾
Move 剪切文件夾
Exist 判斷是否存在
GetFiles 得到指定的目錄下全部文件的全路徑
GetDirectory 得到指定目錄下全部文件夾的全路徑
8七、WebBrowser瀏覽器控件
url
8八、ComboBox下拉框控件
DropDownStyle:控制下拉框的的外觀樣式
名字:cbo+...
案例:日期選擇器
8九、進程
咱們能夠把計算機中每個運行的應用程序都當作一個進程,而一個進程又由多個線程組成的
90、線程
前臺線程:只有全部的前臺線程都關閉才能完成程序關閉
後臺線程:只有全部的前臺線程結束,後臺線程自動結束
Start()啓動線程,告訴CPU能夠被執行了,具體何時執行由CPU決定
將線程設置爲後臺線程:th.IsBackground = true;
頁面加載時取消跨線程的訪問:Control.CheckForIllegalCrossThreadCalls = false;
解決建立窗口句柄時出錯:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//當你關閉窗體時候,判斷線程是否爲null
if (th != null)
{
//結束這個線程
th.Abort();
}
}
9一、GDI+
GDI+是一種繪圖裝置接口,可將應用程序和繪圖硬件分隔,讓咱們可以編寫和裝置無關的應用程序,它可讓咱們不需注意特定顯示裝置的詳細數據,即可在屏幕或打印機顯示信息。
咱們能夠呼叫GDI+類別提供的方法,而後這麼方法會適當的呼叫特定的裝置驅動程序,完成繪圖。
9二、繪圖
//建立GDI對象
Graphics g = this.CreateGraphics();
//建立畫筆對象
Pen pen = new Pen(Brushes.Red);
9三、HTML
超文本標記語言
在HTML中存在着大量的標籤,咱們用HTML提供的標籤,將要顯示在網頁中的內容包含起來,構成了咱們的網頁
CSS:控制網頁內容顯示的效果
HTML+CSS = 靜態網頁
9四、HTML中的標籤
p標籤:段落標籤
 :空格
h#:標題標籤
<!--要註釋的內容-->:註釋符
<img/>:圖片的標籤,用來顯示圖片
src:表示要顯示的圖片的路徑
height:圖片的高度
width:圖片的寬度
alt:當圖片因爲某些緣由顯示失敗的時候所顯示的文本
title:當光標移動到圖片上的時候顯示的文本
<hr/>:分割線
<font></font>:字體標籤 size = 1~7 7最大 Color:顏色 face:字體系列
a標籤:超連接 href表示要連接到的地址 target:打開新網頁的方式 _blank表示打開一個新網頁 _self表示在當前頁面進行跳轉
9五、寫入CSS的三種樣式
內聯樣式表:在標籤內設置元素的樣式
嵌入樣式表:須要在head標籤內寫<style tyle="text/css"></style>
外部樣式表:link
9六、文件操做
File 操做文件,靜態類,對文件總體操做(拷貝、刪除、剪切)
Directory 操做目錄(文件夾),靜態類
Path 對文件或目錄的路徑進行操做
FileStream 文件流,抽象類
StreamReader 快速讀取文本文件
StreamWriter 快速寫入文本文件
目錄和文件操做的命名控件 System.IO
string ChangeExtension(string path, string extension) 修改文件的後綴,支持字符串層面
string Combine(string path1, string path2) 將兩個路徑合併一個路徑
string GetDirectoryName(string path) 獲得文件的路徑名
string GetExtension(string path) 獲得文件的擴展名
string GetFileName(string path) 獲得文件路徑的文件名部分
string GetFileNameWithoutExtension(string path) 獲得去除擴展名的文件名
string GetFullPath(string path) 獲得文件的全路徑,可根據相對路徑得到絕對路徑
9七、單例模式
1.將構造函數私有化
2.提供一個靜態方法,返回一個對象
3.建立一個單例
9八、XML可擴展的標記語言
XML:存儲數據
注意:
XML是嚴格區分大小寫的
XML標籤也是成對出現的
XML文檔有且只有一個根節點
9九、委託
1.爲何要使用委託?
將一個方法做爲參數傳遞給另一個方法
2.委託概念
聲明一個委託類型
委託所指向的函數必須跟委託具備一樣的簽名
3.匿名函數
沒有名字的函數
4.練習:使用委託求數組的最大值
5.練習:使用委託求任意數組的最大值
6.泛型委託
7.多播委託
8.Lamda表達式
public delegate void DelOne();
DelOne del = () => { }; //delegate(){};
9.使用委託來實現窗體傳值
進階知識
一、C#的語言規範
VS安裝目錄:D:\Program Files\VS2012\VC#\Specifications\2052\CSharp Language Specification.docx
二、VS編譯.exe文件
1.先編寫一個.cs文件
2.經過csc編譯器將.cs文件編譯成"僞exe" -> "程序集"(微軟中間語言IL)
3.運行"exe文件"(將"僞exe"文件經過"即時編譯"[jit -> just in time]) -> 機器碼
三、變量的命名
首先咱們要保證的就是變量的名稱必定要有意義(就是咱們看到了變量的名字,就知道變量在這段程序中的做用)
Camel:多餘用給變量或者字段命名,第一個單詞的首字母小寫,其他每一個單詞的首字母大寫。
咱們給字段命名,前面必須加下劃線。
_highSchoolStudent
Pascal:要求咱們每一個單詞的首字母都要大寫,其他每一個單詞的首字母小寫。
HighSchoolStudent
int max= GetMax();
int min= GetMin();
四、面向對象複習
類決定了對象將要擁有的屬性和行爲。
封裝:
--->減小了大量的冗餘代碼
--->封裝將一坨很難理解的功能封裝起來,可是對外提供了一個很簡單的使用接口。咱們會使用就OK。
繼承:
--->減小了類中的冗餘代碼
--->讓類與類產生了關係,爲多態打下了基礎。
特性:
單根性:一個子類只能有一個父類
傳遞性:爺爺類 爹類 兒子類
里氏轉換:
一、子類能夠賦值給父類
二、若是父類中裝的是子類對象,則能夠將這個父類轉換爲對應的子類對象
---->關鍵字
一、is:返回bool類型,指示是否能夠作這個轉換
二、as:若是轉換成功,則返回對象,不然返回null
做用:咱們能夠將全部的子類都當作是父類來看,針對父類進行編程,寫出通用的代碼,適應需求的不斷改變。
多態:
--->虛方法
virtual override
--->抽象類
abstract override
--->接口
interface
五、正則表達式
正則表達式:是一個模板,咱們可使用這個模板,去一坨字符串中找到咱們想要的數據。
注意:正則表達式是操做字符串的。
組成:限定符,元字符,經常使用的表達式"^[0-9]{6}$" 徹底匹配以^開頭,以$結尾
"^(1[0-9]|2[0-5])$" 輸入10~25之間的數字(1後面只能輸入0~9,2後面只能輸入0~5)
"^\\d{11}$" 或 @"^\d{11}$" 驗證11位手機號碼
"^(z|food)$" 只匹配z和food爲true,其他的爲false
@"^([1-9]\d{14}|[1-9]\d{16}[0-9xX])$" 驗證身份證號碼
Regex.IsMatch(); //判斷給定的字符串是否匹配某個正則表達式
Regex.Match(); //從給定的字符串中按照正則表達式提取一個匹配的字符串
Regex.Matches(); //從給定的字符串中按照正則表達式提取全部匹配的字符串
Regex.Replace(); //替換正則表達式匹配的字符串爲另一個字符串
六、委託與事件
委託的做用:佔位,在不知道未來要執行的方法的具體代碼的時,能夠先用一個委託變量來代替方法調用(委託的返回值,參數列表要肯定),在實際調用以前,須要爲委託賦值,不然爲null。
事件的做用:事件的做用和委託變量同樣,只是功能上比委託變量有更多的限制
1.只能經過+=或-=來綁定方法(事件處理程序)
2.只能在類內部調用(觸發)事件
在C#中咱們常常看到:
private void button1_Click(object sender,EventArgs e){
......
}
上面是一個按鈕的點擊事件:
1.對象:button
2.事件名:click
3.參數:object sender其實就是button,EventArgs e是事件須要的資源數據
七、反射
經過類型元數據來獲取對象的一些相關信息,而且能夠實例化對象調用方法等,這個就叫作反射
VS的智能提示就是經過反射獲取類的屬性、方法等,還有反編譯工具也是經過反射實現
反射就是動態獲取程序集的元數據的功能
Type類實現反射的一個重要的類,經過它咱們能夠得到類中的全部信息,包括方法、屬性等。能夠動態調用類的屬性、方法
反射就是直接經過.dll來建立對象、調用成員
八、HTTP協議
輸入地址,開始向服務器發送請求,固然發送的數據必須按照HTTP協議運行組織。
1.請求報文:瀏覽器向服務器發送請求數據,按照http協議進行組織(HTTP請求)
請求頭
請求行 (Request-Line) GET / HTTP/1.1 請求的方式,請求的頁面地址,HTTP協議的版本
實體頭 Accept application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */* 瀏覽器告訴服務器瀏覽器能處理的數據類型
Accept-Encoding gzip, deflate 瀏覽器支持的壓縮方式
Accept-Language zh-CN 瀏覽器語言版本(服務器將數據壓縮完給瀏覽器,瀏覽器再解壓縮獲得數據)
Connection Keep-Alive 保持長鏈接(是HTTP協議的一種優化方式)
Host localhost:6159 服務器的地址
UA-CPU AMD64 CPU
User-Agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) 瀏覽器和操做系統版本CRLF(頭部結束標籤)
請求體
HTTP數據體
2.響應報文:服務器處理完成後,會將處理的結果返回給瀏覽器
響應頭
響應行 (Status-Line) HTTP/1.1 200 OK 所使用的協議和響應狀態碼
實體頭 Cache-Control private
Content-Encoding gzip
Content-Length 304 響應報文體的長度
Content-Type text/html; charset=utf-8 服務器返回的數據類型
Date Sun, 30 Sep 2018 06:10:43 GMT
Server Microsoft-IIS/8.0
Vary Accept-Encoding
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
X-SourceFiles =?UTF-8?B?RDpcV29ya0xpc3RcZGVtb1xXZWJTaXRlXGRlZmF1bHQuYXNweA==?=CRLF(頭部結束標籤)
響應體
HTTP數據體
九、IIS處理程序及讀取模板文件
IIS的安裝:
先裝IIS的話,後面裝Net Framework的時候會自動註冊、處理aspx和ashx等的處理擴展程序
先裝Net Framework,後裝IIS
擴展程序註冊再命令:aspnet_regiis -i
1.開啓cmd命令窗口(用管理員帳戶打開)C:\Windows\System32\cmd.exe
2.定位到目錄:cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
3.在vs的命令提示符程序中註冊一下:aspnet_regiis -i
注意:
瀏覽器發送http://localhost/First.ashx給服務器,IIS會根據請求的文件類型進行判斷,若是發現瀏覽器請求的是動態文件(ashx),IIS是處理不了的,會將請求的文件交給.netframework來執行。IIS是經過aspnet_isapi.dll來把請求的動態文件交給.netframework,再返回給瀏覽器
十、get post請求
(1)若是表單是以Get方式將數據發送到服務器,那麼會將用戶在表單中輸入的數據放在瀏覽器的地址欄中發送到服務端
格式:http://localhost:2454/RrequestMethod/AddInfo.ashx?/txtName=itcast&txtPwd=123
以表單元素name屬性的值=用戶輸入的值 & 以表單元素name屬性的值=用戶輸入的值
在AddInfo.ashx中怎樣接收數據?
在服務端接收數據string userName=context.Request.QueryString["txtName"];//接收的是表單元素name屬性的值
string userPwd = context.Request.QueryString["txtPwd"];
(2)若是數據是以post提交,那麼表單中的數據所有都放在請求報文的請求體中,格式以下:
在服務端接收數據string userName=context.Request.Form["txtName"];
string userPwd = context.Request.Form["txtPwd"];
(3)表單在提交時究竟是Get仍是Post?
通常狀況用Post
Post提交比Get提交更安全
Post發送的數據比Get大(文件)
搜索用Get
(4)除了將form標籤中的method屬性設置爲post或get之外,是否還有其餘的方式,表示Get請求或Post請求?
在瀏覽器地址中直接輸入地址,敲回車,也是向服務器發送Get請求
Post只有將表單中的method改爲Post這一種請求
十一、Http協議無狀態性
Http協議的無狀態性。第二次請求沒法獲取第一次請求的處理結果。(後續請求沒法獲取以前請求的計算的結果)
提交表單時,只提交表單元素的Value屬性的值,<div>,<span>沒法進行提交
自增:
int num = convert.ToInt32(context.Request.Form["textNum"]);
num++;
十二、Windows下使用Memcache
下載Memcache:http://code.jellycan.com/Memcache/
將服務程序拷貝到一個磁盤上的目錄
安裝服務cmd-->Memcache.exe -d install 打開服務監視窗口,能夠查看服務是否啓動
啓動服務cmd-->Memcache.exe -d start (restart重啓,stop關閉服務)
卸載服務:Memcached.exe -d uninstall(先關閉服務)
檢查服務是否啓動:鏈接到Memcache控制檯-->telnet ServerIP 11211 輸入命令:stats檢查當前服務狀態
13.三層架構
三層分爲:UI層、業務邏輯層、數據訪問層
1.UI層引用:業務邏輯層(BLL)、模型層(Model)、通用層(Common)
2.業務邏輯層引用:數據訪問層(DAL)、模型層(Model)、通用層(Common)
3.數據訪問層引用:模型層(Model)、通用層(Common)
14.版本控制器
1.項目經理:搭建基本框架,建立倉儲,上傳最原始的代碼
2.員工:獲取最新的代碼,完成後續開發
Update:將服務器代碼更新本地代碼
Commit:將本地代碼更新到服務器代碼
恢復歷史版本:右鍵文件 -> show log -> 在指定版本上右鍵 ->revert
對比:右鍵文件 -> show log -> 在指定版本上右鍵 -> compare with working copy
注意事項:
1.工做初次打開解決方案時應向服務器請求最新代碼
2.工做結束時,保證解決方案能編譯經過,而後向服務器簽入最新代碼
3.不要長時間簽出項目或解決方案,當項目添加新項後未編輯任何程序代碼時,應當即簽入項目,以便其餘成員可操做該項目
4.不要簽出整個目錄。而且除非特別必要,不該同時簽出過多的項
5.某工做步驟完成後,應編譯整個項目,以檢驗當前工做。若是不出編譯錯誤,應儘快簽入這部分代碼
6.不要不通過編譯而簽入可能不經過的代碼,這將影響全部成員的進度
7.依賴項也須要添加到版本庫
8.編譯出來的文件不該該加入版本控制