1.不可變性由于字符串是不可變的的,每次修改字符串,都是創(chuàng)建了一個單獨字符串副本(拷貝了一個字符串副本)。之所以發(fā)生改變只是因為指向了一塊新的地址。2.字符串池(只針對字符串常量)當(dāng)一個程序中有多個相同的字符串常量時,多個變量指向的是內(nèi)存中同一塊字符串!這個特性叫字符串池。之所以字符串,不會造成程序混亂,是因為字符串的不可變性。
PS:這里重載方式很多,不一一列舉。
1.Contains(String str) 判斷字符串中是否包含,指定字符串。
用法
string str ="helloworld";
str.Contains("hello"); //true
2.StartsWith(String str)
判斷字符串對象是否以,指定字符串開頭。
3.EndWith(String str)
判斷字符串對象是否以,指定字符串結(jié)尾。
4.Length 屬性
獲取字符串的長度
5.IndexOf(String str)
獲取指定字符/字符串.....在對象字符串中第一次出現(xiàn)的位置。
6.LastIndexOf(String str)
獲取指定字符/字符串....在對象字符串中最后一次 出現(xiàn)的位置。
7.SubString(int start)
SubString(int strat, int length) 從指定位置,截取字符串。
8.ToLower()
將串轉(zhuǎn)換成小寫,返回一個新的全小寫的字符串。
9.ToUpper()
將串轉(zhuǎn)換成大寫,返回一個新的全大寫的字符串。
10. Replace(string oldStr,string newStr)
用新的字符串,替換對象字符串中老的字符串部分。
11.Trim() 去掉對象字符串兩端的空格
TrimStart() 去掉對象字符串 開頭的空格
TrimEnd() 去掉對象字符串 結(jié)尾的空格
PS:如果想去掉其他的開頭結(jié)尾的其他字符其他的字符,可以采用Trim()的其他重載。
12.Split() 把對象字符串,按照指定字符分割成一個字符串?dāng)?shù)組!
Split() 的重載同樣很多,
例如 Split(new char[]{'|'}, StringSplitOption.RemoveEmptyEntries)// 刪除空數(shù)據(jù)
1.IsNullOrEmpty(string)
//string.IsNullOrEmpty(str1) 判斷某字符串是否為null,或者為空字符串。
2.Equals(string,string,StringComparison.OrdianlIgnore)忽略大小寫比較兩個字符串是否相同。3.Join(string,string[])把一個數(shù)組按照指定字符串,拼接成一個字符串。
1. Interval 屬性表示 Timer控件的時間間隔。
類型是int默認(rèn)是毫秒。
2. Enabled 屬性 表示Timer控件是否激活。
如果激活的話,一進入Timer的Tick事件就開始執(zhí)行。所以默認(rèn)是false
3. Start() 方法
開始執(zhí)行
4. Stop() 方法
停止執(zhí)行
5. Tick 事件
表示Timer控件將要執(zhí)行的代碼。
1.添加一個Timer控件
2.設(shè)置好必要的屬性后。直接寫 timer_Tick事件。在事件中寫個停止條件就好了。
Timer timer = new Timer();
timer.Interval = 100;
//使用Lambda表達式
timer.Tick += (sender,e) =>
{
if (巴拉巴拉巴拉)
{
timer.Stop();}
};
timer.Start();
為什么使用StringBuilder要從string對象的特性說起。
string對象在進行字符串拼接時,因為字符串的不可變性,string對象會每次拼接,都會復(fù)制一個副本出來進行運算,而本身的串仍然留在內(nèi)存中,大量的臨時片段會造成不可忽視的性能損耗。所以在進行大量的字符串拼接時建議使用StringBuilder
string s1 = "33";
string s2 = "44";
string s3 = "55"; //需求是把 s1 s2 s3拼接在一起。這是一種典型的字符串拼接。
//使用StringBuilder ,不會產(chǎn)生無用的臨時字符串。
StringBuilder sb =new StringBuilder();
//拼接方式一
sb.Append(s1);
sb.Append(s2);
sb.Append(s3);
//拼接方式二
//因為Append()方法會返回一個this,也就是對象本身。所以可以使用這種方式。
//鏈?zhǔn)骄幊?nbsp; Jquery中常用這種方式
sb.Append(s1).Append(s2).Append(s3);
//最后把sb.ToString()一下就好了。
PS:AppendLine()方法可以 自動添加一個回車。
DateTime是.NET中的時間類型,可以通過DateTime完成諸如獲取當(dāng)前的系統(tǒng)時間等操作。
DateTime在.NET中是一個結(jié)構(gòu)體,而并不是一個類。![]()
如上圖所示,
這個圖標(biāo)在VS中 表示結(jié)構(gòu)體。
1.Now
獲取當(dāng)前系統(tǒng)時間。格式如下圖2.Today
![]()
獲取當(dāng)前今日日期。格式如下圖3.年 月 日 時 分 秒
接下來的幾個對象,必須通過
DateTime.Now(或者DateTime.Today)再點才能引用的到。
Year 獲取年 Hour 獲取小時
Month 獲取月 Minute 獲取分鐘
Day 獲取日 Second 獲取秒4.DayOfWeek、DayOfYear//以Year為例:DataTime.Now.Year
獲取當(dāng)前日期是星期幾5.TryParse()以及獲取當(dāng)前日期是一年中的第幾天
判斷是否是時間類型,參數(shù)中有一個out可以輸出一個DateTime對象。在當(dāng)前時間基礎(chǔ)上加幾天 返回一個DateTime6.AddDays()、AddHours()
在當(dāng)前日期基礎(chǔ)上加幾個小時 返回一個DateTime
7.Subtract(DateTime.Now)比較兩個時間的 時間差 返回一個TimeSpan
預(yù)定義模式
DateTime date =DateTime.Now;
date.ToString(format)
參數(shù)format格式詳細用法
格式字符 關(guān)聯(lián)屬性/說明
d ShortDatePattern
D LongDatePattern
f 完整日期和時間(長日期和短時間)
F FullDateTimePattern(長日期和長時間)
g 常規(guī)(短日期和短時間)
G 常規(guī)(短日期和長時間)
m、M MonthDayPattern
r、R RFC1123Pattern
s 使用當(dāng)?shù)貢r間的 SortableDateTimePattern(基于 ISO 8601)
t ShortTimePattern
T LongTimePattern
u UniversalSortableDateTimePattern 用于顯示通用時間的格式
U 使用通用時間的完整日期和時間(長日期和長時間)自定義模式y、Y YearMonthPattern
d 月中的某一天。一位數(shù)的日期沒有前導(dǎo)零。
dd 月中的某一天。一位數(shù)的日期有一個前導(dǎo)零。
ddd 周中某天的縮寫名稱,在 AbbreviatedDayNames 中定義。
dddd 周中某天的完整名稱,在 DayNames 中定義。
M 月份數(shù)字。一位數(shù)的月份沒有前導(dǎo)零。
MM 月份數(shù)字。一位數(shù)的月份有一個前導(dǎo)零。
MMM 月份的縮寫名稱,在 AbbreviatedMonthNames 中定義。
MMMM 月份的完整名稱,在 MonthNames 中定義。
y 不包含紀(jì)元的年份。如果不包含紀(jì)元的年份小于 10,則顯示不具有前導(dǎo)零的年份。
yy 不包含紀(jì)元的年份。如果不包含紀(jì)元的年份小于 10,則顯示具有前導(dǎo)零的年份。
yyyy 包括紀(jì)元的四位數(shù)的年份。
gg 時期或紀(jì)元。如果要設(shè)置格式的日期不具有關(guān)聯(lián)的時期或紀(jì)元字符串,則忽略該模式。
h 12 小時制的小時。一位數(shù)的小時數(shù)沒有前導(dǎo)零。
hh 12 小時制的小時。一位數(shù)的小時數(shù)有前導(dǎo)零。
H 24 小時制的小時。一位數(shù)的小時數(shù)沒有前導(dǎo)零。
HH 24 小時制的小時。一位數(shù)的小時數(shù)有前導(dǎo)零。
m 分鐘。一位數(shù)的分鐘數(shù)沒有前導(dǎo)零。
mm 分鐘。一位數(shù)的分鐘數(shù)有一個前導(dǎo)零。
s 秒。一位數(shù)的秒數(shù)沒有前導(dǎo)零。
ss 秒。一位數(shù)的秒數(shù)有一個前導(dǎo)零。
.net中的中異常的父類是Exception,大多數(shù)異常一般繼承自Exception。
可以通過編寫一個繼承自Exception的類的方式,自定義異常類!
Try
{
可能發(fā)生異常的代碼
后續(xù)代碼
}
Try以外的代碼
catch(Exception e)
{
}
finally
{
}
上述代碼描述如下
1.誰能執(zhí)行 在異常處理中,一旦try里面有了問題,程序會放棄異常的后續(xù)代碼直接跳到catch中。
執(zhí)行完了catch中的代碼,繼續(xù)執(zhí)行Try以外的代碼。
2.關(guān)于catch()中的參數(shù)e
e就是發(fā)生異常的異常類對象,可以任意取名。不是必須叫e的。
3.只拋一個
一塊try中的代碼只能拋出一個異常。
為什么呢?
因為一旦異常就拋出了啊,后面有也不執(zhí)行了呀!
4.獲取信息
可以通過 e.Message獲取異常信息
5.必須執(zhí)行
finally 無論如何都會執(zhí)行
6.可以沒有catch
可以只有 try catch
也可以只有try finally
1.不要逃避問題不要只把異常catch住,什么都不做,或者只是打印一下,這不是優(yōu)秀的“異常處理”作風(fēng)。
不知道怎么處理異常,就不要catch。讓他暴露出來。既然發(fā)生異常了,問題就肯定是有的,逃避不是辦法,直面他,才能解決他。尤其在分層的項目中。會讓程序陷入深度的邏輯混亂狀態(tài)。而問題被藏起來了,你甚至不知道哪里發(fā)生了問題。
2.如果真的遇到亂try、catch的程序員怎么辦?
vs很強大,它想到了這種情況。點擊【調(diào)試】【異?!窟M入這樣一個工具,選中第二行 的引發(fā)選項。
這樣在調(diào)試的時候,無論是否try catch都會暴漏出異常。我們想要的信息就找到了。
.NET中的IO操作,經(jīng)常需要調(diào)用一下幾個類。
1.FileStream類
文件流類,負(fù)責(zé)大文件的拷貝,讀寫。
2.Path類
Path類中方法,基本都是對字符串(文件名)的操作,與實際文件沒多大關(guān)系。
3.File類
File類可以進行一些對小文件拷貝、剪切操作,還能讀一些文檔文件。
4.Dirctory
目錄操作,創(chuàng)建文件、刪除目錄,獲取目錄下文件名等等。
1.ChangeExtension(path,".jpg")
改變文件后綴名!
2.Combine(s1,s2)
將兩個路徑連起來
3.獲取文件名的幾個方法
1)Path.GetFileName(s1); //獲取路徑中的文件名
2)Path.GetFileNameWithoutExtension(s1); //獲取文件名,不包括后綴名!
3)Path.GetDirectoryName(s1)//獲取路徑中的目錄不包括文件名。
4)Path.GetExtension(s1); //只獲取擴展名
4.GetFullPath("")
獲取完整路徑,根據(jù)相對路徑獲得絕對路徑。
5.臨時目錄
1)GetTempPath() //獲取當(dāng)前用戶的臨時目錄
2)GetTempFileName() //獲取一個隨機的文件名,并在臨時目錄下創(chuàng)建這個文件。
3)GetRandomFileName() //僅獲取一個隨機文件名。
1.創(chuàng)建目錄
Directory.CreateDirectory(@"目錄");
2.判斷某個目錄是否存在某文件
string path =@"路徑";
if(Directory.Exists(path))
{
}
3.刪除目錄
1)Directory.Delete(path); //刪除空目錄 ,目錄下沒有文件了。
2)Directory.Delete(path,true); //不管空不空,都刪!
3)如果沒有目錄就會報異常,最好用if(Directory.Exists(path))判斷一下。
4.移動文件目錄
重命名目錄也用這個來做。
Directory.Move(@"c:/a",@"c:/abc");
5.DirectoryInfo
可以把文件夾當(dāng)作對象來使用
DirectoryInfo dirInfo = new DirectoryInfo(@"path");
6.獲取當(dāng)前目錄下的所有直接子目錄 和 直接子文件
//獲取目錄下的直接子目錄
String[] dirs =Direcotory.GetDirectories(@"目錄");
//獲取目錄下的直接子文件
String[] files =Directory.GetFiles(@"目錄");
7.獲取當(dāng)前目錄下的目錄和文件 另一種方式
//獲取目錄下的直接子目錄
//String[] dirs =Direcotory.GetDirectories(@"目錄");
//獲取目錄下的直接子文件
//String[] files =Directory.GetFiles(@"目錄");
//—————————以上是6中的做法,他有一定性能上的問題。什么問題呢?—————————————
使用String[] dirs =Direcotory.GetDirectories(@"目錄");是必須要等獲取了整個string之后,才能遍歷這個集合。
如果希望,讀到一條處理一條。
建議使用Directory.EnumerateFile()
1)EnumerateFile返回的是一個實現(xiàn)了IEnumerable接口的集合。實際上使用了迭代器模式。
2)SearchOption.ALLDirctories參數(shù),會讓.EnumerateFile()遍歷所有子目錄下的文件。
1.拷貝
File.Copy("Source"," Target",true);
2.判斷是否存在
File.Exists(@"Source") ;
3.剪切
File.Move("Source","Targe");
4.創(chuàng)建
File.Create("path");
5.刪除
File.Delete("path"); //刪除,若沒有,不報錯!
6.讀操作
1)File.ReadAllLines("path",Encoding.Default); //返回一個string[]
2)File.ReadAllTest("path",Encoding.Default); //string
3)File.ReadAllBytes("path");
7.寫操作
1)File.WriteAllLines("path",new string[4],Encoding.Default);//按行寫入一個文件中。
2)File.WriteAllText("path","string");
3)File.WriteAllBytes("path",new byte[4]);
4)File.AppendAllText(); //將string追加到文件中。
8.返回FileStream的快捷方式
1)File.Open(string,FileMode); //返回一個FileStream
2)File.OpenRead(string,FileMode); //返回一個只讀的 FileStream
3)File.OpenWrite(string,FileMode); //返回一個只寫的 FileStream
//1.創(chuàng)建文件流
FileStream fsRead =new FileStream("1.txt",FileMode.Open);
//2.創(chuàng)建緩沖區(qū),正常情況下,是不會直接等于文件大小的。這里只有讀,所以就這么干了。
byte[] bytes =new byte[fsRead.Length];
//3.開始讀取, 返回值是讀取到的長度。
int r =fsRead.Read(bytes,0,bytes.Lenght);
//4.關(guān)閉釋放流
fsRead.Close();
fsRead.Dispose();
//1.創(chuàng)建寫入的文件流
FileStream fsWrite fsWrite =new FileStream(@"xxx",FileMode.OpenOrCreate);
//2.創(chuàng)建緩沖區(qū)
String msg ="HelloWorld";
byte[] bytes =Enconding.UTF8.GetBytes(msg);
//3.開始寫入
fsWrite.Write(bytes,0,bytes.Length);
//4.關(guān)閉
fsWrite.Close();
fsWrite.Dispose();
/*在文件流寫入的時候,經(jīng)常需要string 和 byte數(shù)組之間的轉(zhuǎn)換。
這里簡單的描述一下,這方面的做法。*/
1.string 到 byte[]數(shù)組。
string msg ="HelloWorld";
//使用UTF8編碼
byte[] bytes =System.Text.Encoding.UTF8.GetByte(msg);
//使用系統(tǒng)默認(rèn)編碼
byte[] bytes =System.Text.Encoding.Default.GetByte(msg);
2.byte[]到string
string newMsg =System.Text.Encoding.UTF8.GetString(bytes);
為什么中文會亂碼?
UTF8 編碼中,一個中文字符占用兩個字節(jié)。
GBK 編碼中,一個中文字符占用三個字節(jié)。
UTF8 編碼中,用兩個字節(jié)保存一個漢字,如果你用GBK讀取,按照三個字節(jié)一個字的格式去讀。當(dāng)然亂碼了。反之也是一樣的。
總結(jié)起來,無論是36碼的鞋子,穿在50碼的腳丫子上。還是36碼的腳丫子,穿50碼的鞋。看起來都不會很舒服。
所以,按照什么格式寫入,就按照什么格式讀取。才是正解。
PS:1.Utf8是國際標(biāo)準(zhǔn)。
2.GB2312 是國標(biāo)編碼,支持中文的。
3.GBK是對GB2312的擴展,支持繁體中文。
1.Dispose()表示釋放資源,.NET中對Dispose()有一個統(tǒng)一的約定或者叫描述。這個約定表現(xiàn)為一個接口。
或者說這個接口,是一個紅頭文件,紅頭文件中約定了如何釋放資源。
所有實現(xiàn)了IDisposable接口的類都可以釋放,可以Dispose();
那么類庫中什么樣的類會實現(xiàn)IDisposable接口呢?
我的理解是這樣的,一般僅占用托管堆中內(nèi)存資源的類或?qū)ο?。一般不需要Dispose()。垃圾回收就搞定了。
但是對于,文件句柄,網(wǎng)絡(luò)端口號,數(shù)據(jù)庫連接等,CLR的垃圾回收機制是不管的。
所以一般這部分內(nèi)容需要實現(xiàn)IDisposable接口。
//只有把fs定義在這里,finally中才能引用得到。
FileStream fs =null;
try
{
fs =new FileStream(@"文件路徑",FileMode.Create);
byte[] bytes = Encoding.Default.GetBytes("HelloWorld");
fs.Write(bytes,0,byte.Length);
}
finally
{
if(fs != null) //如果fs未賦值,那么直接Dispose就會引發(fā)空指針異常。
{
fs.Dispose();
}
}
簡化上述的寫法,雖然嚴(yán)謹(jǐn)?shù)巧晕⒂悬c麻煩。Microsoft提供了語法糖。就是using的語法using(某個可以釋放資源的類){操作}//1.操作執(zhí)行完,會自動釋放。//2.using語句編譯完成以后,會形成跟上面類似的代碼。就是使用try finally。
//按行寫入
StreamWriter sw =new StreamWriter(@"target",true,Encoding.GetEnconding("GB2312"));
sw.WriteLine("HelloWorld");
//按行讀取
StreamReader sr =new StreamReader(@"Source");
sr.ReaderLine(); //每次返回一個字符串
我在這里學(xué)的很開心!每天都會有一點收獲。感謝 如鵬網(wǎng).NET訓(xùn)練營Online
新聞熱點
疑難解答