C#基礎整理(五)
1.複習
字串
(1)字串的不可變性
(2)字串的方法:
1)Split()
分割 把字串中不想要的內容分割掉 返回一個字串型別的陣列
可以新增StringSplitOption.RemoveEmptyEntries 把空格都去除了,但是前面需要放入一個字元陣列型別
例:
1 string str = “ABC DE FG”;
2 string [] s=str.Split(new char[] { ’ ’ }, StringSplitOptions.RemoveEmptyEntries);
2)Substring()
切割 切割字串 返回一個string型別
輸入0-?的數值(把字串當做一個char型別的陣列,數值為下標),返回一個從輸入數值開始算起的字串,前面的都截掉
如果後面還要新增一個數值 ,那就是擷取的長度
例:
1 string str = “ABCDEFG”;
2 str=str.Substring(2,3)
3)ToUpper()
轉大寫 把字母轉為大寫
例:
1 string str = “abcdefg”;
2 str=str.ToUpper();
4)ToLower()
轉小寫 把字母轉為小寫
例:
1 string str= “ABCDEFG”
2 str=str.ToLower();
5)Trim()
去兩端的空格
例:
1 string str=" abcdefg "
2 str=str.Trim();
6)TrimEnd()
去尾部空格
例:
1 string str = "abcdefg ";
2 str=str.TrimEnd();
7)TrimStart()
去首部的空格
例:
1 string str = " abcdefg";
2 str=str.TrimEnd();
8)Contains()
判斷是否包含某個字串
例:
1 string str = “ABCDEFG”;
2 if(str.Contains(“CD”))
3 {Console.WriteLine(“包含”);}
4 else
5 {Console.WriteLine(“不包含”);}
9)Replace()
替換 把舊的字元或字串替換成新的字元或字串,返回一個新的字串
例:
1 string str = “小李子是個白痴”;
2 str=str.Replace(“白痴”,"**");
10)IndexOf()
查詢某個字元第一次出現的位置,返回一個Int型別,如果沒有,返回一個-1。
例:
1 string str = “adasafdsgfdhgfdhg”;
2 int nums=str.IndexOf(‘g’);
11)LastIndexOf()
查詢某個字元最後一次出現的位置,返回一個Int型別,如果沒有,返回一個-1。
12)StartsWith()
判斷是否以某個字元開頭,返回一個bool型別
例:
1 string str = “adasafdsgfdhgfdhg”;
2 if(str.StartsWith(“a”))
3 {Console.WriteLine(“是的”);}
4 else
5 {Console.WriteLine(“不是”);}
13)EndsWith()
判斷是否以某個字元結尾,返回一個bool型別
例:
複製程式碼
1 string str = “adasafdsgfdhgfdhg”;
2 if(str.StartsWith(“g”))
3 {
4 Console.WriteLine(“是的”);
5 }
6 else
7 {
8 Console.WriteLine(“不是”);
9 }
複製程式碼
14)string.join()
把一個數組按指定的分隔符連線,返回一個string型別
join()裡第一個放自定義string型別的分隔符,第二個放要連線的陣列
例:
1 int[] str = { 1,2,3,4,5,6,7,8 };
2 string b=string.Join("|", str);
15)string.IsNullOrEmpty()
判斷一個字串是null或者空
例:
複製程式碼
1 string str = “”;
2 if(string.IsNullOrEmpty(str))
3 {
4 Console.WriteLine(“是的”);
5 }
6 else
7 {
8 Console.WriteLine(“不是”);
9 }
複製程式碼
16)ToCharArray()
把字串轉為char型別的陣列
例:
1 string s = “121324”;
2 char [] chs=s.ToCharArray();
17)new string (char[] chs)
把陣列轉為字串
例:
1 char[] chs = { ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’ };
2 string str=new string(chs);
繼承:解決類中的程式碼冗餘,把類中的一些相同的程式碼提取出來封裝成一個父類
屬性、方法、建構函式(子類預設呼叫父類無引數的建構函式,因為子類要使用父類的成員,就要建立父類的物件)
this:當前類的物件
呼叫自己的建構函式
base:呼叫父類的建構函式
new:隱藏父類的成員
2.里氏轉換
object 是一切型別的基類
1)子類可以賦值給父類:如果一個地方需要一個父類作為引數,我們可以給一個子類代替
例1:
父類:Person 子類:Student
Student s=new Student();
Person p=s;
簡寫:
Person p=new Student();
例2:
string str= String.Join("|",object類)
父類不能呼叫子類成員,但是子類可以賦值給父類
2)如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件
子類可以呼叫父類的成員,但是父類不能呼叫子類的成員
例:
Student ss=(Student)p;
ss.StudentSayHello();
3)進行里氏轉換強轉的時候經常有可能拋異常,需要來判斷。
is:表示型別轉換,如果能夠轉換成功,則返回一個true,否則返回一個false.不會拋異常。
例:
Person p = new Student();
if(p is Teacher)
{
Teacher ss = (Teacher)p;
ss.TeacherSayHello();
}
else
{
Console.WriteLine(“轉換失敗”);
}
as:表示型別轉換,如果能夠轉換則返回對應的物件,否則返回一個Null
例:
Person p = new Student();
Student t = p as Student;
t.StudentSayHello();
練習題
隨機列印十個打招呼的方法
1)建立一個10位的父類空白陣列
2)建立一個隨機數的方法
3)for迴圈父類陣列
4)給隨機數賦值1-7,6位
5)用switch-case隨機給陣列賦值各個物件
6)用for迴圈將10個數組的打印出控制檯
7)使用if-else if 將物件強轉,由is來判斷,並輸出方法
((強轉)陣列名).方法
複製程式碼
1 Person[] pers = new Person[10];
2 Random r = new Random();
3 for (int i = 0; i < pers.Length; i++)
4 {
5 int rNumber = r.Next(1, 7);
6 switch(rNumber)
7 {
8 case 1:pers[i]=new Student();
9 break;
10 case 2:
11 pers[i] = new Teacher();
12 break;
13 case 3:
14 pers[i] = new ShuaiGUO();
15 break;
16 case 4:
17 pers[i] = new YeShou();
18 break;
19 case 5:
20 pers[i] = new MeiNv();
21 break;
22 case 6:
23 pers[i] = new Person();
24 break;
25 }
26 }
27 for (int i = 0; i < pers.Length; i++)
28 {
29 if(pers[i]is Student)
30 {
31 ((Student)pers[i]).StudentSayHello();
32 }
33 else if(pers[i] is Teacher)
34 {
35 ((Teacher)pers[i]).TeacherSayHello();
36 }
37 else if(pers[i] is ShuaiGUO)
38 {
39 ((ShuaiGUO)pers[i]).ShuaiGuoSayHello();
40 }
41 else if(pers[i] is YeShou)
42 {
43 ((YeShou)pers[i]).YeShouSayHello();
44 }
45 else if(pers[i] is MeiNv)
46 {
47 ((MeiNv)pers[i]).MeiNvSayHello();
48 }
49 else
50 {
51 pers[i].PersonSayHello();
52 }
53 }
54 Console.ReadKey();
複製程式碼
4.protected訪問修飾符
受保護的:可以在當前類的內部以及該類的子類中訪問。
比private的許可權高一些
5.Path類
擷取一個路徑最後一個檔案的名稱。
例1:
string str = @“C:\Users\SJD\Desktop\123.txt”;
int index= str.LastIndexOf(’\’);
str=str.Substring(index + 1);
例2:用Path來做,返回一個字串名字
快速獲得一個路徑下檔案的名字
string str = @“C:\Users\SJD\Desktop\123.txt”;
Console.WriteLine(Path.GetFileName(str));
例3:Path.GetFileNameWithoutExtension(str)
獲得檔名,但是不包括副檔名
例4:Path.GetExtension(str)
獲得檔案的副檔名
例5:Path.GetFileNameWithoutExtension(str)
獲得檔案所在的全目錄資料夾
例6:Path.GetFullPath(str)
獲得檔案所在的全路徑
例7:Path.Combine(@“c:\a”,“1.txt”)
連線兩個字串作為路徑
Path這個類是專門用來操作路徑的
6.ArrayList集合
//建立一個集合物件
ArrayList list=new ArrayList();
//集合:很多資料的一個集合
//陣列:長度不可變、型別單一
//集合的好處:長度可以任意改變,型別隨便
例:
list.Add(1);
list.Add(3.14);
list.Add(true);
list.Add(“張三”);
list.Add(‘男’);
list.Add(5000m);
列印
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
//我們將一個物件輸出到控制檯,預設情況下,列印的就是這個物件所在的類的名稱空間
Add表示新增一個元素
AddRange表示新增一個集合
例:
ArrayList list = new ArrayList();
//新增單個元素用Add
list.Add(true);
list.Add(1);
list.Add(“張三”);
//新增集合元素用AddRange
list.AddRange(new int[]{1,2,3,4,5,6,7,8,9});
list.AddRange(list);
for(int i=0;i<list.count; i++)
{
console.writeline(list[i]);
}
console.readkey();
list.Clear()
清空所有元素
list.Remove(true);
刪除單個元素,寫誰就刪誰
list.RemoveAt(0);
根據下標去移除元素
list.RemoveRange(0,3);
根據下標去移除一定範圍元素,從下標開始,刪除幾個
list.Reverse();
反轉
list.Sort();
升序排列
list.Insert(1, “插入的”);
根據下標,插入一個任意元素
list.InsertRange(2, new string[] { “張三”,“李四”,“王二麻子”});
根據下標,插入一個任意的集合元素
bool b = list.Contains(1);
Console.WriteLine(b);
判斷是否包含某個指定的元素,返回一個Bool型別
if(!list.Contains(“小李子”))
{
list.Add(“小李子”)
}
else
{
console.writeline(“已經有了”);
}
判斷是否不包含某個指定的元素,不包含就建立一個,包含就提示已經有了。
7.集合的長度問題
//count 表示這個集合中實際包含的元素的個數
//capcity表示這個集合中可以包含的元素的個數
每次集合中實際包含的元素個數(count)超過了可以包含的元素的個數(capcity)的時候,
集合就會向記憶體中申請多開闢一倍的空間,來保證集合的長度一直夠用。
個數有1個,就開4個的空間,個數是5,就開8個的空間,依次類推翻倍 X2
8.HashTable集合 鍵值對集合
字典 孫 sun----孫 根據拼音找sun這個漢字
根據鍵來找值
HashTable ht=new HashTable();
ht.Add(鍵,值); 鍵和值都是object型別的,鍵和值都是任意的
新增鍵值對 輸入鍵和值
查詢鍵值對 在鍵值對集合中,是根據鍵去找值的。
console.writeline(ht[鍵]);輸出的就是值了。
在鍵值對集合當中,我們是根據鍵去找值的。
鍵值對物件[鍵]=值;
*******:鍵值對集合當中,鍵必須是唯一的,而值是可以重複的
ht.Add(1, “張三”);
ht.Add(2, true);
ht.Add(3, ‘男’);
ht.Add(false, “錯誤的”);
ht.Add(5, “張三”);
ht[6]=“新來的”;//這也是一種新增方式
特殊性 ht[1]=“把張三幹掉”;(鍵必須是唯一的,但是用這種方法可以替換)
[]做了一個判斷,如果集合裡面鍵沒有1,就把這個鍵值加進去
如果集合裡面鍵有1,就把它替換掉。
//abc----cba
新增之前先判斷一下是否包含abc,如果有就不新增,沒有才新增
if(ht.contains(1))
Contains
ContainsKey 這兩種都是判斷是否包含鍵
ContainsValue 判斷是否包含值
ht.clear();移除集合中所有的元素
ht.Remove();根據鍵移除
9.foreach迴圈
foreach 兩下tab鍵
foreach(var item in collection)
{
}
Hashtable ht = new Hashtable();
ht.Add(1, “張三”);
ht.Add(2, true);
ht.Add(3, ‘男’);
ht.Add(false, “錯誤的”);
foreach (var item in ht.Keys)
{
Console.WriteLine(ht[item]);
}
根據鍵來辨別每一項的元素
foreach (var item in ht.Values)
{
Console.WriteLine(item);
}
根據值來辨別每一項的元素
item 集合裡的每一項,每一個元素
collection 集合
//var:根據值能夠推斷出來型別
//c#是一門強型別語言:在程式碼當中,必須對每一個變數的型別有一個明確的定義
int n=15;
string n2=“張三”;
double n3=3.14;
decimal n4=5000m;
bool n5=true;
char n6=‘男’;
console.writeline(n.GetType()); 獲得變數型別
var n=15;
var n2=“張三”;
var n3=3.14;
var n4=5000m;
var n5=true;
var n6=‘男’;
console.writeline(n.GetType());通過值獲得變數型別
能拿到這個變數型別是因為你已經對這個變數進行了一個明確的定義,已經告訴它這個變數的型別是什麼了。
變數必須有一個明確的定義
首先確定變數的型別
//js是一門弱型別語言
//12 3.14 true “fdfsf” 'c’都用var
它不需要對你的變數有一個明確的定義,它可以根據你的值來推斷你這個值的型別
為什麼不用它,因為
string input;
input=“張三”;
var input; 會報錯,因為input沒有給他付初值。在使用推斷型別var的時候,就必須給它賦值
input=“張三”;
根據變數的值來推斷變數的型別,之所以不用,是因為使用Var的同時必須賦值
迴圈次數特別大的時候
foreach的效率是for迴圈的很多很多倍,次數不高的時候差不多
11.File類的基本操作
File.Create();在指定路徑新建檔案
例:
File.Create(@“C:\Users\SJD\Desktop\小李子是個2B.txt”);
File.Delete();刪除指定路徑的檔案
例:
File.Delete(@“C:\Users\SJD\Desktop\小李子是個2B.txt”);
File.Copy();複製一個路徑的檔案到另一個路徑
例:
File.Copy(@“C:\Users\SJD\Desktop\小李子是個2B.txt”, @“C:\Users\SJD\Desktop\1\new.txt”);
1024byte=1kb
1024kb=1M
1024M=1G
1024G=1T
1024T=1PT
12.編碼
美國人發明了計算機,他們日常生活中用的都是az,09
計算機中存資料都是二進位制 如要存個a,可能就是以10001110儲存
10001110就稱為a在計算機中的編碼
美國人最早,他們用的編碼叫 ASC 128
後來歐洲國家也用計算機 他們除了az,09之外,音標上和美國人不一樣。這點東西不夠用了。
他們用的編碼叫ASCII 256
全世界開始用計算機,中國也開始用。中國推出了編碼GB2312 國標
後來 國標只包含簡體字
臺灣,香港,澳門用繁體字,五大硬體廠商自己做了編碼 Big5 繁體字
美國人發現編碼太多了,大家做一些事情的時候很麻煩。
出了一個統一的編碼
unicode編碼 囊括了每個國家都能使用的編碼格式
這個編碼很全,但是解析起來很慢
正好趕上網際網路飛速發展
都用UTF-8 針對web的一個編碼。
編碼:將字串以怎樣的形式儲存為二進位制。
亂碼:
產生亂碼的原因:就是你儲存這個檔案所採用的編碼,跟你開啟這個檔案所採用的編碼格式不一樣。
13.複習
里氏轉換
1)子類可以賦值給父類
2)如果父類中裝的是子類物件,那麼將這個父類強制轉換為子類物件
集合
1)ArrayList
新增單個元素 Add
新增一個集合 AddRange
移除 Remove
RemoveAt
RemoveRange
插入 Insert
插入集合 InsertRange
清空 Clear
反轉 Reverse
排序 Sort
2)HashTable 怎樣根據鍵去找值 ht[鍵]=值;
儲存的型別都是object
Path 操作路徑的
File
Create 建立
Delete 刪除
Move 剪下
Copy 複製
讀取資料 ReadAllBytes() 位元組陣列要轉換成字串 Encoding.Default.GetString(位元組陣列)
寫入資料 WriteAllBytes() 字串轉換成位元組陣列 Encoding.Default.GetBytes(字串)