寒假在家無聊,找了一本還不錯的電子書來學習, 一是複習了以前最初學的一些基本類, 二是學一些那時候老師沒有教的東西, 看的書是pdf的所以下麵全部都是手打出來的,有什麼錯誤在所難免。 其實一個寒假只看了這麼一點還是很懶惰的。 放上來以後自己好查。以後空閑了還可以看看。 快捷鍵 Ctrl + Ente ...
寒假在家無聊,找了一本還不錯的電子書來學習,
一是複習了以前最初學的一些基本類,
二是學一些那時候老師沒有教的東西,
看的書是pdf的所以下麵全部都是手打出來的,有什麼錯誤在所難免。
其實一個寒假只看了這麼一點還是很懶惰的。
放上來以後自己好查。以後空閑了還可以看看。
===================================================================================================
快捷鍵
Ctrl + Enter (在游標指定位置的上面添加一行,並將游標移至新添加行的行首位置)
Ctrl + Shift + Enter (在游標指定位置的下麵添加一行,並將游標移至新添加行的行首位置)
Ctrl + Shift + L (刪除當前行)
Ctrl + M + O (摺疊所有的函數)
Ctrl + M + P (展開所有的函數)
Ctrl + E + C (註釋) <=> Ctrl + K + C (註釋)
Ctrl + E + U (取消註釋) <=> Ctrl + K + U (取消註釋)
Ctrl + R + E 自動生成屬性
6: Ctrl + . (調出using菜單;對於沒有實現的類可以自動生成)
7: Ctrl + E + S (查看空白 -- 將空格轉換為綠色的點,在查找多餘的空格時尤為方便)
F12 (轉到定義)
Ctrl + _ (轉到定義後返回)
Ctrl + Shift + _ (再次轉到定義)
Ctrl + Atl + P (Attach to Process 跟蹤調試某個進程)
Ctrl + Shift + 左右方向鍵 (以單詞為單位向左或向右選中代碼)
Ctrl + Tab (切換VS中的不同文件視窗)
Alt + Tab (切換Windows的不同視窗)
prop + Tab + Tab (創建C#中的屬性,之後用Tab進行位置的切換)
Ctrl + K + X (Insert Snippet 插入VS定義好的代碼模板, 例如 選擇其中的Visual C# 之後可以選擇好多種不同的模塊,例如選擇prop name和12的效果是一樣的, 還可以選擇 try,tryf,using,while 等等,這些可以到VS中實際去看看 )
Ctrl + B + T (標記當前行)
Ctrl + B + P (將游標移動到前一個標記行)
Ctrl + B + N(將游標移動到後一個標記行)
Ctrl + B + C (移除所有的標記行)
Ctrl + W + B (列出所有的標記行,即:打開一個新的視窗,若想打開更多的小視窗請點擊VIEW)
【註:標記行可以標記我們所關註的代碼段,從而實現不同代碼段的切換,例如我想比較兩端代碼段的異同,或者參照某段代碼實現新的功能。當然也肯定不會忘 Ctrl + A, Ctrl + C, Ctrl + V, Ctrl + X, Ctrl + Z, Ctrl + S】
Ctrl + E + D (對當前頁VS中的代碼塊進行格式化) ,選中VS中的代碼 然後 Ctrl + E + F (對選中的代碼段進行格式化)
===================================================================================================
比較字元串方法:Compare,CompareTo,Equals
1.Compare int Compare(str1,str2,bool) 比較兩個字元串,bool為true就會忽略大小寫,返回值0表示相等
2.CompareTo str1.CompareTo(str2) 其實比較的是在字典中的位置
3.Equals str1.Equals(str2) 相同返回true,反則false
string1.Equals(str1,str2)
格式化字元串: string.Format(str1)
截取字元串: str1.Substring(int,int) 開始位置,截取字元數量
分割字元串: str1.Split(char[]) 返回一個數組
插入字元串: str1.Insert(int,str) 插入位置,插入字元串
填充字元串: str1.padRight(int,char) padLeft 結果中的字元串數量,填充字元
刪除字元串: str1.Remove(int,int) 開始刪除的位置,指定刪除的數量
替換字元串: str1.Replace(str,str) 或者兩個char 待替換的字元串,替換的新字元串
===================================================================================================
int[] arr = new int[5]{1,2,3,4,5};
聲明一個數組變數可以不對其初始化,但在對數組初始化時必須使用new運算符
string[] arrStr;
arrstr = new string[7]{"sun","mon","tue","wed","thu","fri","sat"}
聲明一個兩行兩列二維數組
int[,] arr = new int[2,2];
int[,] arr = new int[2,2]{{1,2},{3,4}};
初始化時也可以不指定行數和列數
int[,] arr = new int[,]{{1,2},{3,4}};
獲取數組的行數與列數
arr.GetLength(0);列數
arr.GetLength(1);行數
冒泡排序
int[]arr = nem int[]{1,9,27,6,12,21,15};
foreach(int m in arr)
{
for(int i=0;i<arr.Length-1;i++);
{
int j=i+1;
int temp;
id:
if(arr[i]>arr[j])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp
}
else if(j<arr.Length-1)
{
j++
goto id;
}
}
foreach(int n in arr)
{
Console.Write(n+" ");
Console.ReadLine(n+" ");
}
}
使用函數進行排序
Array.Sert(arr);從小到大
Array.Reverse(arr);反向排序(從大到小)
===================================================================================================
使用ArrayList集合
ArrayList list = new ArrayList();
ArrayList list = new ArrayList(10);指定大小
ArrayList list = new ArrayList(arr);
ArrayList方法
List.Add(7);將對象添加至集合結尾處
List.Insert(3,7);將元素添加到索引處,將7添加到索引3
List.Clear();從集合中移除所有元素
List.Remove(3);從集合中移除特定對象的第一個匹配對象
List.RemoveAt(3);移除集合中特定索引處的元素
List.RemoveRange(3,2);從索引3開時移除2個元素
List.Contalns(2);判斷集合中是否包含指定的元素,返回布爾值
List.IndexOf(3);搜索指定的對象,返回第一個匹配項,否則返回-1
List.LastIndexOf(3);返回最後一個匹配項的索引,否則返回-1
===================================================================================================
使用Hashtable哈希表
Hashtable通常稱為哈希表,用於表示鍵/值的集合,
其每一個元素都是一個存儲於DictionaryEntry對象中的鍵/值對。
鍵不能為空,但值可以。
Hashtable table = new Hashtable();
table.Add("id","001");添加的元素
table.Clear();移除所有元素
table.Remove("id");移除指定鍵的元素
foreach(DictionaryEntry dieEntry in table)Hashtable中的元素是一個鍵/值對,DictionaryEntry類型表示一個鍵/值對的集合。
table.Contains("id");搜索Hashtable中是否包含特定鍵,返回布爾值
table.ContainsValue("001");判斷是否含有特定值,返回布爾值
===================================================================================================
面向對象
繼承:子類可以繼承父類中的屬性和方法,可以簡化類的操作,很大程度上提高開發效率
子類從基類繼承時,會獲得基類所有的方法,欄位,屬性,事件。若要更改基類的數據和行為,可以使用新的派生類成員替換基類成員,或者重寫虛擬的基類成員。使用新的派生成員替換基類的成員,就需要使用new關鍵字new關鍵字放在子類方法,欄位,屬性的返回類型之前。
屬性:get,set
靜態方法:靜態方法不對特定實例操作,在靜態方法中引用this會導致編譯錯誤。
方法重載:調用同一方法名,但各方法中的參數類型,個數,或順序不同。
結構:是一種值類型,結構中可以包含構造函數,常量,欄位,方法,屬性,運算符,事件和嵌套類型等,但如果要同時包括上述幾種成員則應該考慮使用類。使用struct定義
構造函數:通常用來初始化新對象的數據成員
多重繼承:c#的類只支持單繼承,而介面支持單繼承,實現時,繼承的多個介面使用,隔開
多態:多態使子類的實例可以直接賦予基類的對象(不需強制轉換)然後通過這個對象調用派生類的方法
封裝可以隱藏實現細節,使得代碼模塊化。
繼承可以擴展已經存在的代碼塊,它們的目的都是為了代碼重用。
多態則是為了實現介面重用。
在C#中類的多態性是通過在子類中重寫基類的虛方法或者函數成員來實現的。
C#中,繼承,虛方法和重寫方法組合在一起才能實現多態性。
===================================================================================================
介面
介面是一種用來定義程式的協議,描述可屬於任何類或結構的一組相關行為。
介面可由方法,屬性,事件,索引器這四種成員類型的任何組成構成,但不能包含欄位。
類和結構可以繼承多個介面。
繼承介面時,將繼承成員定義但不繼承實現。
若要實現,類中的對應成員必須是公共的非靜態的,並具有相同名稱與簽名。
介面不包含方法的實現,介面自身可從多個介面繼承。
聲明介面使用 interface 關鍵字。
介面成員必須是公共的。
顯式介面成員實現:返回類型.介面名.方法名。
===================================================================================================
抽象類
抽象類主要用來提供多個派生類可共用的的基類的公共定義。
與非抽象類的區別是抽象類不能實例化,不能被密封,可以包含抽象成員。
聲明時使用 abstract 關鍵字。
從抽象類派生一個非抽象類時,需要在非抽象類中重寫抽象方法使用 override 關鍵字。
抽象類和介面的區別有
它們的派生類只能繼承一個基類,只能直接繼承一個抽象類,但可以繼承多個介面。
抽象類可以定義成員實現,介面不可以。
抽象類可以包含欄位,構造函數,析構函數,靜態成員,常量等,介面不可以。
抽象類的成員可以是私有的(只要不是抽象的),受保護的,內部的,但介面成員必須是公共的。
抽象類主要用於做對象的系列的基類,共用某些主要特性,例如共同的目的和結構。
介面則主要用於類,這些類在基礎水平上,但仍可以完成某些相同的任務。
===================================================================================================
密封類
密封類可以用來控制擴展性,如果密封了某個類,則其他成員不能從該類繼承。
如果密封了某個成員,則派生類不能重寫對該成員的實現。
聲明密封類使用 sealed 關鍵字
密封類中不能聲明受保護成員或者虛成員受保護成員只能在派生類訪問,虛成員只能在派生類重寫。
密封類不能聲明為抽象的。
密封方法只能用於對基類的虛方法進行重寫,並提供具體實現。
因此聲明密封方法時sealed總和override同時使用
===================================================================================================
枚舉類型
枚舉是由用戶定義的數據類型,其基礎類型可以是除Char外的任何整形。
如果沒有顯式聲明基礎類型,則使用Int32。
枚舉是值類型的一種特殊形式。
枚舉類型由名稱,基礎類型和一組欄位組成。
基礎類型必須是一個內置的整數類型。
欄位為靜態文本欄位,其中的每一個欄位都表示常數。
同一個值可以分配給多個欄位但必須將其中某個值標記為主要枚舉值,以便進行反射和字元串轉換。
enum 枚舉名
{
標示名稱=整形數據類型值
}
===================================================================================================
泛型
泛型的類型參數T可以看作是一個占位符,它不是一種類型,僅代表某種可能的類型。
泛型介面的聲明
interface 介面名<T>
{介面體}
===================================================================================================
LinQ
在c#3.5中聲明變數時,可以不明確指定數據類型,使用關鍵字var來聲明。
var number = 2099;
聲明var變數需要初始化,不能為null。
Lambda表達式是一個匿名函數,他可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型。
所有Lambda表達式都使用Lambda運算符 => 讀作goes to。
運算符左邊是輸入參數(如果有),右邊是表達式或語句塊。
Lambda表達式無法從封閉方法中捕獲ref或out參數。
捕獲的變數不會被作為垃圾回收,直到引用變數的委托超出範圍為止。
LINQ查詢表達式包含8個基本子句。
from 指定數據源和範圍變數
select 指定當前查詢時返回的序列中的元素將具有的類型和形式
group 按照指定的鍵值對查詢結果進行分組
where 根據一個或多個由邏輯&&和||分隔的布爾表達式篩選元素
orderby 基於元素類型的預設比較器
join 基於兩個指定匹配條件之間的相等比較來連接兩個數據源
let 引入一個用於存儲查詢表達式中的子表達式結果的範圍變數
into 提供一個標識符,它可以充當對join,group或select子句的引用
===================================================================================================
File類支持對文件的基本操作,它包括用於創建複製刪除移動和打開文件的靜態方法。
Copy 將現有文複製到新文件
Create 在指定路徑創建文件
Delete 刪除指定的文件,不存在不引發異常
Exist 確定文件是否存在
Move 將制定文件移動到新位置,並提供指定新文件名的選項
Open 打開指定路徑上的FileStream
CreateText 創建或打開一個文件用於寫入UTF-8編碼的文本
GetCreationTime 返回指定文件或目錄的創建日期和時間
GetLastAccessTime 返回上次訪問指定文件或目錄的日期和時間
GetLastWriteTime 返回上次寫入指定文件或目錄的日期和時間
OpenRead 打開現有文件以進行讀取
OpenText 打開現有UTF-8編碼文件以進行讀取
OpenWrite 打開現有文件以進行寫入
ReadAllBytes 打開一個文本文件,將文件的內容讀入一個位元組數組,然後關閉該文件
ReadAllLins 打開一個文本文件,將文件的所有行讀入一個字元串數組,然後關閉該文件
ReadAllText 打開一個文本文件,將文件的所有內容讀入一個字元串,然後關閉該文件
Replace 用其他文件的內容替換指定文件的內容,過程中刪除原始文件,創建被替換文件背份
SetCreationTime 設置創建該文件的日期和時間
SetLastAccessTime 設置上次訪問文件的日期和時間
SetLastWriteTime 設置上次寫入文件的日期和時間
WriteAllBytes 創建一個新文件,將其中寫入一個位元組數組,然後關閉該文件,存在則改寫文件
WriteAllLins 創建一個新文件,將其中寫入一個字元串數組,然後關閉該文件,存在則改寫文件
WriteAllText 創建一個新文件,將其中寫入內容,然後關閉該文件,如果存在該文件,則改寫文件
Fileinfo類僅可以用於實例化的對象。
CreationTime 獲取當前FileSystemInfo的創建時間
Directiory 獲取父目錄實例
DirectioryName 獲取表示目錄完整路徑的字元串
Exists 獲取指示文件是否存在的值
Extension 獲取表示文件擴展名部分的字元串
FullName 獲取目錄或文件的完整目錄
IsReadOnly 獲取或設置當前文件是否為只讀的值
LastAccessTime 獲取或設置上次訪問文件的日期和時間
LastWriteTime 獲取或設置上次寫入文件的日期和時間
Length 獲取當前文件大小
Name 獲取文件名
Directory類公開了用於創建移動枚舉,刪除目錄和子目錄的靜態方法
CreateDirectiory 創建指定路徑中的所有目錄
Delete 刪除指定的目錄
Exists 確定指定路徑是否引用磁碟上的現有目錄
GetCreationTime 獲取目錄的創建日期和時間
GetDirectiories 獲取指定目錄中子目錄名稱
GetDirectioryRoot 獲取指定路徑的根信息,捲信息
GetFiles 返回指定目錄中的文件名稱
GetFilesSystemEntries 返回指定目錄中的文件和子目錄的名稱
GetLastAccessTime 返回上次訪問指定文件或目錄的日期和時間
GetLastWriteTime 返回上次寫入指定文件或目錄的日期和時間
GetParent 檢索指定路徑的父目錄,包括絕對路徑和相對路徑
Move 將文件或目錄及其內容移動到新位置
SetCreationTime 為指定的文件或目錄設置創建日期和時間
SetDirectiories 將應用程式的當前工作目錄設置為指定的目錄
SetLastAccessTime 設置上次訪問指定文件或目錄的日期和時間
SetLastWriteTime 設置上次寫入目錄的日期和時間
DirectoryInfo類僅可以用於實例化對象
reationTime 獲取或設置當前FileSystemInfo的創建時間
Exists 確定指定目錄是否存在的值
Extension 獲取表示文件擴展名部分的字元串
FullName 獲取目錄或文件的完整目錄
LastAccessTime 獲取或設置上次訪問指定文件或目錄的日期和時間
LastWriteTime 獲取或設置上次寫入目錄的日期和時間
Name 獲取DirectoryInfo文件名
Parent 檢索指定子目錄的父目錄
Root 獲取路徑的根部分
===================================================================================================
I/O
.NET Framework使用流來支持讀取和寫入文件。
開發人員可以將流視為一組連續的一維數據,包含開頭和結尾,並且其中的游標指示了流當前的位置。
在。NET Framework中,流由Stream類來表示,該類構成了所有其他流的抽象類。
不能創建Stream類的實例,但必須使用它實現某個I/O流類。
FileStrean類,該類公開以文件為主的的Stream,表示在磁碟上或網路路徑上指向文件的流。
一個FileStrean類實例實際上代表一個磁碟文件。
CanRead 獲取一個值,指示當前流是否支持讀取
CanSeek 獲取一個值,指示當前流是否支持查找
CanTimeout 獲取一個值,確定當前流是否可以超時
CanWrite 獲取一個值,指示當前流是否支持寫入
IsAsync 獲取一個值,指示FileStream是非同步還是同步打開的
Length 獲取用位元組表示的流的長度
Name 獲取傳遞給構造函數的FileStream的名稱
Position 獲取或設置此流的當前位置
ReadTimeout 獲取一個值,確定當前流在超時前嘗試讀取多長時間
WriteTimeout 獲取一個值,確定當前流在超時前嘗試寫入多長時間
BeginRead方法 開始非同步讀操作
BeginWrite 開始非同步寫操作
Close 關閉當前流並釋放與之關聯的所有資源
EndRead 等待掛起的非同步讀取完成
EndWrite 結束非同步寫入,在I/O操作完成前一直阻止
Lock 允許讀取訪問的同時防止其他進程更改FileStream
Read 從流中讀取位元組塊並將該數據寫入指定緩衝區
ReadByte 從文件中讀取一個位元組,並將讀取位置提升一個位元組
Seek 將該流的當前位置設置為指定值
SetLength 將該流的長度設定為指定值
Unlock 允許其他進程訪問以前鎖定的某個文件的全部或部分
Write 使用從緩衝區讀取的數據或位元組塊寫入該流
WriteByte 將一個位元組寫入文件流的當前位置
StreamWriter類是專門用來處理文本文件的類,可以方便的向文本文件中寫入字元串。
同時也負責重要的轉換和處理向Filestream對象寫入的工作。
Encoding屬性 獲取將輸入寫入到其中的Encoding
Formatprovider 獲取控制格式設置的對象
NewLine 獲取或設置由當前TextWriter使用的行結束符字元串
Close方法 關閉當前的StringWriter和基礎流
Write 寫入到StringWriter的此實例中
WriteLine 寫入重載參數指定的某些數據,後跟行結束符
StreamReader類
Close方法 關閉StringReader
Read 讀取輸入字元串的下一個字元或下一組字元
ReadBlock 從當前流中讀取最大的count的字元並從index開始將數據寫入Buffer
ReadLine 從基礎字元串中讀取一行
ReadToEnd 將整個流或從流的當前位置到流的的結尾作為字元串讀取
BinaryWriter類以二進位的形式將基元類型寫入流
Close方法 關閉當前的Binary和基礎流
Seek 設置當前流中的位置
Write 將值寫入當前流
BinaryReader類使用特定的編碼將基元數據類型讀作二進位。
Close方法 關閉當前閱讀器和基礎流
PeekChar 返回下一個可用的字元,並且不提升位元組或字元的位置
Read 從基礎流中讀取字元,並提升流的當前位置
ReadBoolean 從當前流中讀取Boolean值,並使該流的當前位置提升一個位元組
ReadByte 從當前流中讀取下一個位元組,並使該流的當前位置提升一個位元組
ReadBytes 從當前流中將Count個位元組讀入位元組數組,並使該流的當前位置提升Count個位元組
ReadChar 從流中讀取下個位元組,並根據Encoding和讀取的特定字元提升該流的當前位置
ReadChars 從流中讀取Count個位元組,並根據Encoding和讀取的特定字元提升該流的當前位置
ReadInt32 從當前流中讀取4位元組有符號整數,並使該流的當前位置提升4個位元組
ReadString 從當前流中讀取一個字元串,字元串有長度首碼,一次七位的被編碼為整數
===================================================================================================
網路編程
DNS類
GetHostAddress 返回指定主機的IP地址
GetHostByAddress 獲取ip地址的DNS信息主機
GetHostName 獲取本地主機名
IPAddress類
IPEndPoint類
Address屬性 獲取或設置終結點的ip地址
Port屬性 獲取或設置終結點的埠號
WebClient類
BaseAddress 設置基URL
Encoding 指定下載字元串的編碼方式
OpenRead 獲取數據
DownloadFile 將內容保存到文件中
WebReque類
WebResponse類
Socket類
Available屬性 獲取已從網路接受可供讀取的數據量
Accept方法 為新建連接創建新Socket
BeginAccept 開始一個非同步操作來接受一個傳入的連接嘗試
BeginConnect 開始一個對遠程主機連接的非同步請求
BeginDisconnect 開始非同步請求從遠程終結點斷開連接
BeginReceive 開始從連接的Socket中非同步接收數據
BeginSend 將數據非同步發送到連接的Socket
BeginSendFile 將文件非同步發送到連接的Socket
BeginSendTo 向特定遠程主機非同步發送數據
Close 關閉Socket連接並釋放所有資源
Connect 建立與遠程主機的鏈接
Disconnect 關閉套接字並允許重用套接字
Receive 接受來自綁定的socket的數據
Send 將數據發送到連接的Socket
Sendfile 將文件和可選數據非同步發送到連接的Socket
SendTo 將數據發送到特定終結點
Shoutdown 禁用某Socket上的發送和接受
TcpClient類
Client屬性 獲取或設置基礎Socket
Connected 獲取值指示是否已經連接到遠程主機
ReceiveTimeout 等待接受時的時間量
SendTimeout 等待發射完成的時間量
Connect方法 使用指定的主機名和埠號鏈接到tcp主機
TCPListener類
UdpClient類
MailMessage類
Attachments屬性 獲取附件集合
Bcc 獲取收件人地址集合
Body 獲取或設置郵件正文
BodyEncoding 獲取或設置郵件正文編碼
CC 獲取抄送人的地址集合
From 獲取或設置發件人地址
Headers 獲取郵件標頭
Priority 獲取或設置此郵件優先順序
ReplyTo 獲取或設置郵件的回覆地址
Sender 獲取或設置此郵件發件人
Subject 獲取或設置主題行
SubjectEncoding 獲取或設置主題內容編碼
To 獲取收件人地址集合
Attachment類
ConntentDisposition屬性 獲取附件MiMe內容標頭信息
ConntentStream 獲取附件內容流
ConntentType 獲取附件內容類型
Name 獲取Mine內容類型名稱值
NameEncoding 獲取用於Name的編碼
TransferEncoding 獲取或設置附件的編碼
CrateAttachmentFromString用字元串創建附件
SmtpClient類
Credentials 獲取或設置用於驗證發件人身份的憑據
Host 獲取或設置用於SMTP事物的主機名稱或ip
Port 獲取或設置用於SMTP事物的埠
SevicePoint 獲取用於傳輸電子郵件的網路連接
Timeout 指示send方法的超時時間
Send 將電子郵件發送到SMTP伺服器,該方法在傳輸中會阻止其他操作
SendAsync 發送,該方法不會阻止調用線程
SendAsyncCancel 取消非同步操作以發送電子郵件
===================================================================================================
線程
每個正在操作系統上運行的應用程式都是一個進程。
一個進程可以包括一個或多個線程。
線程是操作性系統分配處理器時間的基本單元。
在用戶使用該線程實例調用Start方法之前,線程都是出生狀態。
調用Start方法之後,線程處於就緒狀態,獲得系統資源後進入運行狀態。
線程進入就緒狀態,他就會在就緒與運行狀態碾轉。
同時可能進入等待,休眠,阻塞,死亡狀態
進入運行狀態的線程調用Thread類Suspend方法時該線程進入等待狀態。
進入等待狀態的線程必須調用Thread類Resuam方法才能喚醒。
當線程調用hread類Sleep方法時該線程進入休眠狀態。
如果一個線程在運行狀態下發出輸入輸出請求,該線程將進入阻塞狀態。其等待結束時線程進入就緒狀態。
對於阻塞線程來說,即使系統資源空閑,線程依然不能回到運行狀態。
當線程執行完畢,線程進入死亡狀態。
聲明線程Thread thread = new Thrend(new ThreadStart(不帶參方法名,不帶括弧));
聲明線程Thread thread = new Thread(delegate() { GetPort(host, port); });
啟動線程thread.Start();
掛起線程thread.Suspend();
恢複線程thread.Resume();
休眠線程Thread.Sleep(1000);
終止線程thread.Abort();
阻止調用線程直至線程終止thread.Join();
線程優先順序thread.Priority = ThreadPriority.Highest;
lock語句可以用來確保代碼塊運行完成,不會被其他線程終斷。
Object thisLock = new Object();
lock (thislock)
{//代碼塊}
嚴格來說,提供給lock語句的參數只是用來唯一標識由多個線程共用的資源,所以可以是任意類實例。
然而,實際上此參數通常表示需要進行同步得資源。
Monitor類通過向單個線程授予對象鎖來控制對對象的訪問。
當一個線程擁有對象鎖時,其他任何線程都不能獲取該鎖。
Monltor.Enter(this);//鎖定當前線程
Monltor.Exit(this);//釋放線程
Mutex類是同步基本單元,它只向一個線程授予對共用資源的獨占訪問權。
如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。
Mutex mutex = new Mutex(false);
mutex.WaltOne();//組織當前線程
mutex.Release.mutex();//釋放對象
===================================================================================================
獲得滑鼠在窗體上的位置
this.labelx.Text = e.X.ToString();
this.labely.Text = e.Y.ToString();
窗體允許拖放文件
窗體load事件中寫this.AllowDrop = true;設置窗體允許拖放
窗體DragEnter事件中寫
if(e.data.GetDataPresent(Data.Fornats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
}