轉眼幾個月沒更博了,把幾個月前學C#的筆記發一下,就記錄了點教重要的點子而已
1.打印
Console.WriteLine(); 打印
Console.ReadKey(); 按一個按鍵繼續執行
Console.ReadLine(); //用戶輸入文字的時候程序是暫停的,用戶輸入完畢點回車,把用戶輸入的東西做為返回值
例:
string s = Console.ReadLine(); 讀取進去的是字符串,所以不能用其他類型接收
2.數據類型:
值類型:int、float、double、char、byte、Boolean、枚舉
引用類型:DateTime、string、所有類
類型轉換:
值類型:從小到大自動轉,從大到小強制轉,(類型),Convert.To***()
引用類型:需要有繼承關系才可以轉換
轉換成字符串: ToString()
類型轉換:cast 強轉(位數有差,可能丟失)
convert 考慮數據意義的轉換
C#字符串與OC一致,與C不一致,不考慮最後的\0
‘a’ 是char類型,”a”是string類型
@“\\\\” @表示字符串中的\不當成轉義符
3.字符串的處理
·C#中單個字符用單引號包含就是char類型,(‘a’),單引號中放且只能放一個字符。
·單個字符也可以表示為字符串,還可以有長度為0的字符串。
·使用s.Length屬性可以來獲得字符串中的字符個數
·string可以看做是char的只讀數組。char c = s[1];例子:遍歷輸出sting中的每個元素。
·c#中字符串有一個重要的特性:不可變性,字符串一旦聲明就不再可以改變。所以只能通過索引來
讀取指定位置的char進行修改。
·如果要對char進行修改,那麼久必須創建一個新的字符串,用s.ToCharArray()方法得到字符串的
char 數組,對數組進行修改後,調用new string(char[])這個構造函數來創建char數組的字符串。一
旦字符串被創建,那麼char 數組的修改也不會造成字符串的變化。例子:將字符串中的A替換成a.
字符串不可變性(分配的內存塊裡的不可變)
string s1 = @“hello”;
char[] chars = s1.ToCharArray();
string s2 = new string(chars);
此時改變後s2為aello,而s1不變,所以只是復制了一份char數組數據,於源數據無關
如string s = “abc”; s = @“123”
最後值改變了,其實不是
要區分變量名和變量指向的值得區別。程序中可以有很多字符串,然後由字符串變量指向他們,變量可以指向其他的字符串,但是字符串本身沒有變化。字符串不可變性指的是內存中的字符串不可變,而不是變量不變。
4.字符串類的常用函數
1)
·ToLower() 得到字符串的小寫形式。
·注意字符串是不可變的,所以這些函數都不會直接改變字符串的內容,而是把修改後的值通過函數·返回值的形式返回。s.ToLower()與s = s.ToLower()
·ToUpper():得到字符串的大寫形式:Trim()去掉字符串兩端的空白。
·s1.Equals(s2,StringComparison.OrdinallgnoreCase),兩個字符串進行區分大小寫的比較
Ignore:忽略,Case:大小寫
==是區分大小寫的比較,Equals()是忽略大小寫的比較
2)分割字符串
string[] str = strings.Split(‘,’); 將字符串按照指定的分割符分割成字符串數組
將字符串按照指定的char分割符分割成字符串數組(options取RemoveEmptyEntries時,移除結果中的空白字符串)
string str1 = @“aa,bb,,cc,dd”;出現空字符串
string[] str = strings.Split(new char[]{’,’},StringSplitOptions.RemoveEmptyEntries);
將字符串按照指定的string分割符分割成字符串數組(同上)
string[] str = strings.Split(new string[]{“aa”},StringSplitOptions.RemoveEmptyEntries);
3)替換字符串
string.Replace(“a”,”b”); 替換string裡面的a全部成b
獲取子字符串:
string.Substring(n); 從第n位開始截取string的字符串到結束,包含n
string.Substring(n,m); 從第n位開始截取string的字符串長度為m(m超過string長度會出錯),包含n
4)返回bool值 使用:string.Contains
Contains(string value)判斷字符串中是否含有子串value
StartsWith(string value)判斷字符串中是否以子串value開始
EndsWith(string value)判斷字符串中是否以子串value結束
返回int
IndexOf(string value)取子串value第一次出現的位置
枚舉,跟其它語言沒什麼區別
枚舉的意義就在於限定變量的取值范圍
enum sender{a,b}
foreach (string name in names){}; 遍歷,還有for,見多了
static void function(params string[] values){};
params 可變參數 參數必須是形參表中的最後一個參數
函數重載:函數名一致,參數不一致,可做兩個函數使用,與有無返回值無關(不嚴謹)
函數的ref和out參數
函數參數默認是值傳遞的,也就是”復制一份”
而ref是將本身傳進去,非復制
static void Main(string[] args)
{
int age = 20;
1: IncAge(age);
2: IncAge(ref age);
Console.WriteLine(age); //1打印結果為20,因為傳進的只是形參值;2打印結果為21,
Console.ReadKey;
}
1:
static void IncAge(int age)
{
age++;
}
2:
static void IncAge(ref int age)
{
age++;
}
ref必須先初始化因為是引用,所以必須先“有”,才能引用,而out是內部為外部賦值,所以不需要初始化,而且外部初始化也沒有用。
ref應用場景內部對外部的值進行改變,out則是內部為外部變量賦值,out一般用在函數有多個返回值的場所。
string str = Console.ReadLine();
int i;
int.TryParse(str,out i); //轉換 返回值true or false
ref應用,如交換兩個數的值
5.構造函數
·構造函數用來創建對象,並且可以在構造函數中對對象進行初始化。
·構造函數是用來創建對象的特殊函數,函數名和類名一樣,沒返回值,連void都不用。
·構造函數可以有參數,new對象的時候傳遞函數參數即可
·構造函數可以重載,也就是有多個參數不同的構造函數。
·如果不指定構造函數,則類有一個默認的無參構造函數。
如果指定了構造函數,則不再有默認的無參構造函數,如果需要無參構造函數,則需要自己來寫。
如:
static void Main(string[] args)
{
Person p1 = new Person();
Person p2 = new Person(“a”);
Person p3 = new Person(“a”,2);
Console.ReadKey;
}
class Person
{
public Person()
{
}
public Person(string name)
{
}
public Person(string name,int age)
{
}
}
對面可以叫做類的實例,字段就是類的狀態
面向對象的三個特性:封裝、繼承、多態。
6.屬性(可公可私有)
慣用法:屬性開頭字母大寫,字段開頭字母小寫
public字段和屬性的區別,屬性可以進行非法設置值的判斷
class person
{
private int age;
public int Age
{
set //賦值
{
if(age>0)
{
return; //如果return this.Age;造成死循環,自己給自己賦值
}
this.age = value; //value代表用戶賦值過來的值
}
get //取值
{
return this.age;
}
}
}
7.異常
try{
執行到錯誤點後,不再往下執行
}
catch(Exception ex){
出錯後執行,再跳到外面繼續執行
Console.WriteLine(“數據錯誤:”+ex.Message+”。異常堆棧:”+ex.StackTrace);
}
throw:拋出 catch:抓住
//自定義報錯異常聲明
else{
throw new Exception(“自定義異常”);
}
const 常量:不會改變的量
靜態變量:static 屬於全局變量,無需new
在static成員中不能直接調用非static成員
例:
class Person
{
public static int TotalCount;
public int Age;
public static void number()
{
Console.WriteLine(@“{0}”,TotalCount);
//可調用TotalCount,但調不了Age
}
public void Other()//非static成員中科院調用static成員
{
Console.WriteLine(@“{0},{1}”,TotalCount,Age);
}
}
8.靜態類
static class Person
{}
無法被new的類是靜態類,靜態類一般用來實現一些函數庫。
9.命名空間
當有多個類重名時,可放不同文件夾下,或namespace不一樣,使用時寫全路徑就行
當前類文件裡有Person類
另一個文件夾名為hr,或namespace不一致的類下面有個類Person
在當前類文件裡使用hr文件夾裡的Person類時如下:
如果要使用的類和當前的類不在同一個namespace,則需要添加using引用
導入該文件,在頂部
using 命名空間.hr;
命名空間.hr.Person p2 = new 命名空間.hr.Person();
//就像文件的全路徑一樣
10.索引
C#中提供了按照索引器進行訪問的方法
定義索引器的方式:string this[int index]
{
get {
return “”;
}
set{}
}
string為索引器的類型,[]中是參數列表。進行索引器寫操作就是調用
set代碼塊,在set內部使用value得到用戶設置的值;進行讀操作就是
執行get代碼塊。
索引器參數可以不止一個,類型也不限於int,幾號可以是任意類型。
11.
項目認識,從各個地方復制
String.Empty是string類的一個靜態常量;
String.Empty和string=””區別不大
string s1 = "";
string s2 = string.Empty;
if (s1 == s2)<br>{
Console.WriteLine("一模一樣!");
}
// 結果都是True
String.Empty和string=””一樣,同樣需要占用內存空間,為什麼推薦優先使用String.Empty ?
string.Empty只是讓代碼好讀,防止代碼產生歧義
用於控制一個對象是否激活,一個對象激活當且本身active=true,並且它的父結點也都active。相當API有:
1)GameObject.SetActive
2)GameObject.activeSelf
3)GameObjectd.activeInHierarchy
Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)
語法
[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginReceive(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
AsyncCallback callback,
object state
)
參數
buffer
Byte 類型的數組,它是存儲接收到的數據的位置。
offset
buffer 參數中存儲所接收數據的位置,該位置從零開始計數。
size
要接收的字節數。
socketFlags
SocketFlags 值的按位組合。
callback
一個 AsyncCallback 委托,它引用操作完成時要調用的方法。
state
一個用戶定義對象,其中包含接收操作的相關信息。當操作完成時,此對象會被傳遞給 EndReceive 委托。
返回值
Type: System.IAsyncResult
引用異步讀的 IAsyncResult。
異常
Exception
Condition
ArgumentNullException
buffer 為 null。
SocketException
試圖訪問套接字時發生錯誤。有關更多信息,請參見備注部分。
ObjectDisposedException
Socket 已關閉。
ArgumentOutOfRangeException
offset 小於 0。
- 或 -
offset 大於 buffer 的長度。
- 或 -
size 小於 0。
- 或 -
size 大於 buffer 的長度減去 offset 參數的值。
Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)
開始從連接的 Socket 中異步接收數據。
命名空間: System.Net.Sockets
程序集: System(System.dll 中)
語法
[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginReceive(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
AsyncCallback callback,
object state
)
參數
buffer
Byte 類型的數組,它是存儲接收到的數據的位置。
offset
buffer 參數中存儲所接收數據的位置,該位置從零開始計數。
size
要接收的字節數。
socketFlags
SocketFlags 值的按位組合。
callback
一個 AsyncCallback 委托,它引用操作完成時要調用的方法。
state
一個用戶定義對象,其中包含接收操作的相關信息。當操作完成時,此對象會被傳遞給 EndReceive 委托。
返回值
Type: System.IAsyncResult
引用異步讀的 IAsyncResult。
異常
Exception
Condition
ArgumentNullException
buffer 為 null。
SocketException
試圖訪問套接字時發生錯誤。有關更多信息,請參見備注部分。
ObjectDisposedException
Socket 已關閉。
ArgumentOutOfRangeException
offset 小於 0。
- 或 -
offset 大於 buffer 的長度。
- 或 -
size 小於 0。
- 或 -
size 大於 buffer 的長度減去 offset 參數的值。
備注
將 count 個字節從 src 復制到 dst,前者開始於 srcOffset 而後者開始於 dstOffset。
開發人員應謹記 BlockCopy 方法使用偏移量訪問 src 參數,而不是使用索引或數組上下限等編程構造。例如,如果使用應用程序的編程語言聲明一個上限為零,下限為 -50 的 Int32 數組,然後將該數組和偏移量 5 傳遞給 BlockCopy 方法,則該方法將訪問的第一個數組元素是該數組的第二個元素(位於索引 -49 處)。此外,首先訪問數組元素 -49 的哪個字節取決於執行應用程序的計算機的 Edian 設置。
Add和AddRange
Add:將指定的對象添加到……中
AddRange:向……末尾,添加數組
-
在群體操作時,使用AddRange取代Add
用AddRange可以讓我們要加入的東西一次性加入,而不要每次都加一次,這樣顯然可以加快速度。幾乎所有的windows control都支持Add和AddRange兩種方法。