溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

c#開發(fā)之五---c#語言基礎(chǔ)

發(fā)布時(shí)間:2020-06-18 01:24:02 來源:網(wǎng)絡(luò) 閱讀:1270 作者:kuang_hp 欄目:編程語言

第一部分  重點(diǎn)基礎(chǔ)

 

  • 基礎(chǔ)部分

 

1、  快捷鍵

Ctrl+e+d  快速對齊代碼

Ctrl+S    保存

Ctrl+z    撤銷

Ctrl+k+c  注釋代碼

Ctrl+k+u 取消注釋代碼

#region  #endregion 折疊代碼

Ctrl+鼠標(biāo)滾動(dòng)  放大,縮小界面

雙擊tab鍵,自動(dòng)出現(xiàn)console.writeline();

ctrl+.  或者  shift+alt+F10 導(dǎo)入命名空間(using)(當(dāng)關(guān)鍵字下面出現(xiàn)提示的時(shí)候)

ctrl+r+e : 自動(dòng)封裝屬性

2、  數(shù)據(jù)類型

 

Int       整型

Double   浮點(diǎn)型,可帶小數(shù)

Float     浮點(diǎn)型

String     字符串 ,加雙引號

Char      單個(gè)字符,加單引號

Decimal   金錢,錢數(shù)后要加”m”

 

3、“+”號

有一邊有字符類型,起到連接的作用。

兩邊都是數(shù)字,就是相加。

 

3、  占位符”{}”

用在輸出方法中。

例:

String name=”

Int age=30;

Console.Writeline(我叫{0},我今年{1},name,age);

 

4、  輸入、輸出

Consoe.writeline(“請輸入您的姓名”)//提示輸入姓名,把這行字顯示到顯示屏上

String name=Consle.readline();       //定義一個(gè)name字符串變量,把輸入的值存入變量

Consoe.writeline(“您的姓名是{0}”,name)

Console.readkey();

 

 

5、  轉(zhuǎn)義符\+特殊字符組成有特殊意義的字符\n   換行

\r\n windows系統(tǒng)的換行

\t   TAB鍵的空格

\”   雙引號

\b   表示一個(gè)退格符

\\   表示右斜杠。

 

6、@

取消\在字符中的轉(zhuǎn)義作用,例   sting str=@”f:\file\rmvb\1.rmvb”;一般在有路徑的情況下加@符號,取消右斜杠的轉(zhuǎn)義作用。

 

@還可以保留原格式輸出

 

7、  轉(zhuǎn)換

(1)隱式轉(zhuǎn)換  (小的轉(zhuǎn)換成大的,可以自動(dòng)隱式轉(zhuǎn)換,如int轉(zhuǎn)換成double double就不能隱式轉(zhuǎn)換成int)

Int a=3

Double b=3.14

double c=a*b  //隱式把int 的變量a,轉(zhuǎn)換成double類型。

 

2)顯示轉(zhuǎn)換(大的轉(zhuǎn)成小的,就必須顯式轉(zhuǎn)換,必須兼容)

 

Int a=3

 

Double b=3.14

 

Int c=a*(int) b  //顯式的把double轉(zhuǎn)換成int類型

 

 

3convert 轉(zhuǎn)換(類型不兼容的情況下用,但也有限制,如不能把字符abc,轉(zhuǎn)換成doubleint)

 

String s=”123”;

Double d=Convert.ToDouble(s);//string類型的變量轉(zhuǎn)換成double類型,賦值給變量d.

Int c=Convert.ToInt32(s);     //string類型的變量轉(zhuǎn)換成int類型,賦值給變量c.

 

 

8++,--

 

1++

例:

Int a=10;

 

Int b=10+a++;

上面這一個(gè)語句,可以用下面兩條語句表達(dá):

{int b=10+a;  //此時(shí)b=20

a++;       //此時(shí)a=11,  a++a=a+1

}          

 

 

 

例:

Int a=10

 

Int b=10+ ++a;

上面這一個(gè)語句,可以用下面兩條語句表達(dá):

{

a++;       //此時(shí)a=11,  a++a=a+1

 

int b=10+a; //此時(shí)b=21

}          

 

++在前,即先自身加1,再參加運(yùn)算。

++在后,即先用原值參加運(yùn)算,然后自身再加1.

 

 

9、  關(guān)系表達(dá)式和布爾關(guān)型

==

>=

<=

!=

 

關(guān)系運(yùn)算符連接的表達(dá)式,稱之為關(guān)系表達(dá)式。關(guān)系表達(dá)式的結(jié)果只有對和錯(cuò)兩種。用布爾類型來反應(yīng)。

 

例:

 

Bool b=38>39;  //因?yàn)?/span>38小于39,所以這是b的值為False.

 

 

10、             邏輯運(yùn)算符

一般兩邊是布爾類型或關(guān)系表達(dá)式。

&& 

||  

!  

 

11、             復(fù)合賦值運(yùn)算符

 

+=

-+

*=

/=

%=

11、調(diào)試

1F11單步調(diào)試:從頭至尾一行一行的調(diào)試。

2F10  方法調(diào)試

3    斷點(diǎn)調(diào)試,先在想設(shè)斷點(diǎn)的代碼左邊點(diǎn)擊鼠標(biāo),再點(diǎn)擊啟動(dòng),然后再按F11一步一步調(diào)試。

可以在調(diào)試,窗口中,調(diào)出監(jiān)視窗口來監(jiān)視變量

 

 

  • 語句

1if else

 

(1)    if

if(判斷)  //判斷為真執(zhí)行下面的語句。判斷為真后,只執(zhí)行一遍下面的語句,不循環(huán)。

{  }

 

2if else

If(判斷)   //判斷為真執(zhí)行下面的語句,為假則執(zhí)行ELSE里的語句。

{   }

Else

 

{  }

注意,else語句匹配離他最近的if語句。

3if   else-if   //如果第一個(gè)if判斷為真,則執(zhí)行下面大括號的語句,然后跳出,不進(jìn)行后面的所有判斷。

If(判斷)   //主要用來處理多條件區(qū)間性判斷。多條件固定值判斷一般用switch 

{   }

Else if (判斷)

 

{  }

Else if (判斷)

{  }

…….

Else

{  }

2switch

switch(變量或表達(dá)式的值)  //先算出變量或表達(dá)式的值,然后用算出的值與下面catch語句里的值進(jìn)行匹配,匹配成功,就執(zhí)行后面的代碼,遇到break語句,跳出switch語句。如果不成功繼續(xù)與下面的catch里的值進(jìn)行匹配,直到匹配為止,如果都不匹配,則看是否有default語句,有的話就執(zhí)行default語句中的代碼,然后跳出switch。

 

catch 1:要執(zhí)行的代碼

break;

catch 2:要執(zhí)行的代碼

break;

catch 3:要執(zhí)行的代碼

break;

 

……

default:要執(zhí)行的代碼     //都不匹配就執(zhí)行default里的代碼

break;

3、  while

 

1while

while(循環(huán)條件)  //當(dāng)判斷循環(huán)條件成立時(shí),則執(zhí)行下面的循環(huán)體,執(zhí)行完循環(huán)體中的代碼后,再進(jìn)行循環(huán)條件判斷,如成立,繼續(xù)執(zhí)行循環(huán)體,如不成立則跳出while。循環(huán)條件一般為布爾類型或表達(dá)式。

 

{ 循環(huán)體

}

 

 

2do while

Do

 

{ 循環(huán)體}

 

While(循環(huán)條件)  //先執(zhí)行一遍循環(huán)體,再進(jìn)行循環(huán)條件的判斷,判斷為真繼續(xù)執(zhí)行循環(huán)體,否則跳出do while循環(huán)。

 

4、  for  (已經(jīng)知道循環(huán)次數(shù)時(shí)用for

for (表達(dá)式1,表達(dá)式2,表達(dá)式3)

{循環(huán)體}

 

表達(dá)式1為聲明循環(huán)變量,計(jì)錄循環(huán)次數(shù)。如,int i=0

表達(dá)式2為循環(huán)條件,i<10

表達(dá)式3為改變循環(huán)條件的代碼,使循環(huán)條件終有不成立的時(shí)候,如i++。

 

5、  breakcontinue

 

(1)    break

跳出當(dāng)前循環(huán)體,不再循環(huán)。一般不單獨(dú)出現(xiàn),和if一起用,當(dāng)滿足某種條件是跳出循環(huán)體。

 

2continue

跳出本輪循環(huán),重新檢測循環(huán)條件,繼續(xù)下一輪循環(huán)。一般也和if一起用。

 

 

Breakcontunue的區(qū)別好比跑步,如果要跑100圈,當(dāng)跑到10圈遇到break時(shí),直接不跑了,干其他沒干完的事去了。而遇到continue時(shí),你只是臨時(shí)下場,這一圈不跑了,然后再上場接下來跑余下的90圈。

三、異常

1、try  catch finally

 

try              //捕捉異常,包含被異常保護(hù)的代碼

{   }

 

Catch (可帶異常變量,匹配執(zhí)行某類型的異常)        //如果出現(xiàn)異常,將執(zhí)行的代碼

{   }

Catch (可帶異常變量,匹配執(zhí)行某類型的異常)        //如果出現(xiàn)異常,將執(zhí)行的代碼

{   }

……

Finally           //不管出不出現(xiàn)異常,都將執(zhí)行的代碼

 

{   }

 

 

2、throw

 

  • 數(shù)據(jù)類型詳解

(一)  數(shù)據(jù)類型簡介

浮點(diǎn)型:

Float

Double

Decimal

 

整數(shù)型:

Int

Uint

Long

Short

……..

 

非數(shù)值型:

Bool 布爾

Char 單個(gè)字符

 

用戶自定義類型:

class

結(jié)構(gòu) struct

枚舉 enum

委托 delegate

接口 interface

數(shù)組 arry

 

()數(shù)據(jù)類型詳解

 

1、  常量   用在不更改的數(shù)據(jù)上面。如超市統(tǒng)一的打折率。

Const 變量類型  變量名=值;  //常量聲明時(shí)必須賦值,且賦值后就不能再更改。

Const int number=50;          //值就一直為50,不能重新賦值。

Number=40 //這就會(huì)出錯(cuò)。不能改。

 

2、  枚舉

1)語法:

[public] enum 枚舉名:枚舉值類型  (一般枚舉值類型是省略的)

{

         1,                //默認(rèn)為值1=0;

         2,                //默認(rèn)為值2=1;

         3,                //如果此處值3=10;,則值4=11,以此類推。

         ........

}

public:訪問修飾符。公開的公共的,哪都可以訪問。

enum:關(guān)鍵字,聲明枚舉的關(guān)鍵字

枚舉名:要符合Pascal命名規(guī)范

枚舉是值類型,和Int等類似。

枚舉只能存儲(chǔ)同一類型的數(shù)據(jù)。

 

2)枚舉的轉(zhuǎn)換

 

Int類型可以和枚舉互轉(zhuǎn)。

枚舉可以轉(zhuǎn)換成字符串類型,用tostring()方法。

字符串類型轉(zhuǎn)換成枚舉類型時(shí)用parse()方法。

 

 

3、  結(jié)構(gòu)

語法:

[public] struct 結(jié)構(gòu)名

{

         成員;//字段,默認(rèn)是Private類型,要想對外可訪問,要加Public

}

變量在程序運(yùn)行期間只能存儲(chǔ)一個(gè)值,而字段可以存儲(chǔ)多個(gè)值。

 

4、  數(shù)組

數(shù)組類型[] 數(shù)組名=new 數(shù)組類型[數(shù)組長度];

二維或三維就是增加[],

int [][] number=new int[2][3];//二維數(shù)組,兩列三行的數(shù)組,實(shí)例化是一定要指定長度,或直接初始化。

 

***數(shù)組的長度一旦固定了,就不能再被改變了

 

5、  事件

 

  • 方法(函數(shù))就是將一堆代碼進(jìn)行重用的一種機(jī)制。

1、  方法的語法:

函數(shù)的語法:

[public] static 返回值類型 方法名([參數(shù)列表])

{

         方法體;

}

public:訪問修飾符,公開的,公共的,哪都可以訪問。

static:靜態(tài)的

返回值類型:如果不需要寫返回值,寫void

方法名:Pascal 每個(gè)單詞的首字母都大些。其余字母小寫

參數(shù)列表:完成這個(gè)方法所必須要提供給這個(gè)方法的條件。如果沒有參數(shù),小括號也不能省略。

 

方法寫好后,如果想要被執(zhí)行,必須要在Main()函數(shù)中調(diào)用。

2、  方法的調(diào)用與傳遞

類名.方法名([參數(shù)]);

在某些情況下,類名是可以省略的,如果你寫的方法跟Main()函數(shù)同在一個(gè)類中,這個(gè)時(shí)候,

類名可以省略。

參數(shù)傳遞方法有:

值傳遞

引用傳遞

 

當(dāng)方法聲明有返回值類型時(shí),方法體中一定要用return返回一個(gè)同類型的值。

3、  Ref

引用參數(shù),傳輸?shù)氖亲兞康牡刂分?,所以不管是調(diào)用代碼中,還是方法體內(nèi)的更改,值變量值都會(huì)發(fā)生改變。

reft參數(shù)一定要在方法外賦值,方法內(nèi)可以不用賦值。如在調(diào)用代碼中先賦值。

可以把值傳進(jìn)方法,也可以把值從方法中傳出來。

 

staticvoid Main(string[] args)

        {

            double salary = 5000;

            JiangJin(ref salary);//雖然沒有返回值,但代碼中調(diào)用jiangjin方法后,salary的值變成了5500.

            Console.WriteLine(salary);//此處值為5500。

            Console.ReadKey();

        }

 

        publicstaticvoid JiangJin(refdouble s)//此時(shí)是參數(shù)S的地址值,所以此方法中如果改變了參數(shù)的值,在調(diào)用代碼中也會(huì)改變。所以此處也沒有返回值。

        {

            s += 500;

        }

      

 

4、  Out

 

傳輸多余的變量值到調(diào)用代碼中,只能把方法內(nèi)的數(shù)據(jù)傳出去,不能傳進(jìn)來。

一般用在一個(gè)方法中需要返回多個(gè)數(shù)據(jù)類型的值時(shí)。如既需要string類型,也需要返回int類型時(shí)。

調(diào)用的方法中有out關(guān)鍵時(shí),調(diào)用代碼中也需要加上out關(guān)鍵字

out參數(shù)一定要在方法內(nèi)初始化賦值。

 

{          Console.WriteLine("請輸入用戶名");

            string userName = Console.ReadLine();

            Console.WriteLine("請輸入密碼");

            string userPwd = Console.ReadLine();

            string msg1;  //此處可以賦初值也可以不賦初值,因?yàn)榇藚?shù)是out實(shí)參,out實(shí)參在方法體中會(huì)賦初值,且會(huì)把最終返回值到此處。且實(shí)參名不必和形參名一樣,但實(shí)參一定要聲明不可省略。

            bool b = IsLogin(userName, userPwd, out msg1);//調(diào)用IsLogin函數(shù),傳遞實(shí)參到方法的形參中去。此處調(diào)用方法的返回值是bool類型,而多余返回值為msg1string類型。且此處一定要加上out關(guān)鍵字。

            Console.WriteLine("登陸結(jié)果{0}",b);

            Console.WriteLine("登陸信息{0}",msg1);

            Console.ReadKey();

        }

 

        ///<summary>

        ///判斷登陸是否成功

        ///</summary>

        ///<param name="name">用戶名</param>

        ///<param name="pwd">密碼</param>

        ///<param name="msg">多余返回的登陸信息</param>

        ///<returns>返回登陸結(jié)果</returns>

        publicstaticbool IsLogin(string name, string pwd, outstring msg)//此方法的返回值為bool類型,同時(shí)傳遞兩個(gè)參數(shù)值和一個(gè)多余參數(shù)值過來,返回時(shí),會(huì)返回一個(gè)bool類型的方法返回值,還會(huì)多余返回一個(gè)string類型的返回值。且多余返回形參前面一定要加Out關(guān)鍵值。

        {

            if (name == "admin" && pwd == "888888")

            {

                msg = "登陸成功";                           //out參數(shù)賦值。

                returntrue;

            }

            elseif (name == "admin")

            {

                msg = "密碼錯(cuò)誤";                         /out參數(shù)賦值。

 

                returnfalse;

            }

            elseif (pwd == "888888")

            {

                msg = "用戶名錯(cuò)誤";

                returnfalse;

            }

            else

            {

                msg = "未知錯(cuò)誤";

                returnfalse;

            }

5、  Pars

 

 

6、  方法重載

概念:方法的重載指的就是方法的名稱相同給,但是參數(shù)不同。

參數(shù)不同,分為兩種情況

1)、如果參數(shù)的個(gè)數(shù)相同,那么參數(shù)的類型就不能相同。

2)、如果參數(shù)的類型相同,那么參數(shù)的個(gè)數(shù)就不能相同。

***方法的重載跟返回值沒有關(guān)系,即如果僅僅返回值不同,構(gòu)成不了重載。

 

7、  方法的遞歸

自已調(diào)用自已。

要考慮到入口,再考慮到出口。即一定要考慮到什么時(shí)候停止調(diào)用自已。不然就死循環(huán)了。

你調(diào)用多少次遞歸,就要有多少次返回。如你畫圈,調(diào)用遞歸你畫了十層圈,你不能通過return就立即跳出十層圈,而是得一層一層的跳,要跳十次才能跳出。

 

 

六、類

1、  基本語法

[public] [static]class 類名

{

         字段;       //在外面叫變量,在類里叫字段。在類里如果不加修飾符,默認(rèn)為private。

         屬性;       //實(shí)質(zhì)上就是getset方法,主要是為了保護(hù)字段。

         方法;       //實(shí)現(xiàn)方法。

構(gòu)造函數(shù);   //主要是初始化類,如果不定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成一個(gè)默認(rèn)的。

析構(gòu)函數(shù);   //釋放類的資源和空間。

}

 

創(chuàng)建類的對象過程,叫類的實(shí)例化。

 

2、  修飾符

Public:公開的。類里的成員可訪問、類外的成員可以通過類對象訪問、派生類的成員可以直接訪問。

 Private:私有的,只在當(dāng)前類內(nèi)部訪問。只有類里的成員可以訪問,就算是本類的實(shí)例化對象也不能訪問。

Protected:保護(hù)的,只有當(dāng)前類內(nèi)部和派生類(子類)可以訪問,孫子輩也可訪問。。

Internal:當(dāng)前程序集中訪問。(當(dāng)前項(xiàng)目中訪問),在同一項(xiàng)目中,和public權(quán)限是一樣的。修飾類時(shí),不加修飾符時(shí),Internal是默認(rèn)修飾符。

Protected internal:protected+internal的權(quán)限。

 

只有public intenal可修飾類類型,如: public class test(){};

子類的訪問權(quán)限不能高于基類,會(huì)暴露父類的成員。

 

3、屬性(在字段下按快捷鍵ctrl+r+e快速實(shí)現(xiàn)屬性。)

Set Get的應(yīng)用

一般面向?qū)ο缶幊陶Z言都要求成員變量不能直接暴露給外部訪問,如下:
public class A
{
    public int Age;   //
這是不好的,待會(huì)有程序員可能把-1賦給Age
}
為了防止亂賦值,C#設(shè)計(jì)了一個(gè)屬性機(jī)制,要求把成員變量設(shè)為私有,在通過屬性來控制成員變量的讀寫,如下:
public class B
{
    private int age;  //
私有成員字段
    public int Age    // age
的屬性,字段的屬性名一般是把字段名首字母大寫。此聲明等同于public int Age(int value),value是隱含參數(shù),只是不寫出來。
    {
        get{ return age; }  //
讀取器,當(dāng)代碼中調(diào)用屬性時(shí),啟動(dòng)get方法,在get方法中也可以寫判斷語句,賦值等,和set一樣。在get里有判斷的話,判斷類中的字段。
        set{                //
寫入器,當(dāng)代碼中給屬性賦值時(shí),調(diào)用set方法。在set中就判斷value
            if(value>0)
              age = value;   //value
是準(zhǔn)備寫入的值
        }
    }
}
這樣Age就像保安一樣,擋在age的前面。訪問age的時(shí)候需要通過Age許可,如下:
B b = new B();
b.Age = -1;  //
這是不行的,-1被帶入valuevalue<0,判斷不成立
b.Age = 10;  //
這是可行的,當(dāng)給屬性賦值時(shí)調(diào)用屬性的set方法。把10傳到Age屬性的value隱形參數(shù)中,并且調(diào)用set方法。

Consloe.WriteLine(“請輸入年齡{0}”,b.Age)//此時(shí)調(diào)用Age屬性中的get方法,調(diào)用時(shí)只調(diào)用屬性,不會(huì)直接調(diào)用私有化的字段

 

屬性中setget不是必須都需要的,但必須有其中一個(gè)。如果只有set方法就是只寫屬性,如果只有get方法,就是只讀屬性。

屬性的作用就是保護(hù)字段、對字段的賦值和取值進(jìn)行限定。

屬性的本質(zhì)就是兩個(gè)方法,一個(gè)叫get()一個(gè)叫set()。

既有get()也有set()我們誠之為可讀可寫屬性。

只有get()沒有set()我們稱之為只讀屬性

沒有get()只有set()我們稱之為只寫屬性

 

4、靜態(tài)static和非靜態(tài)

內(nèi)存的區(qū)域:

棧:存儲(chǔ)值類型,如Int,enum,struct

:存儲(chǔ)引用類型,如string,interface,class ,arry,dynamic,object等。即在棧里只有一個(gè)指針,指針指向堆里的地址,所有的數(shù)據(jù)都存在堆里。

靜態(tài)存儲(chǔ)區(qū)域:存儲(chǔ)靜態(tài)類型。靜態(tài)存儲(chǔ)區(qū)域所有項(xiàng)目成員都可以訪問,所以靜態(tài)成員在整個(gè)項(xiàng)目中資源共享。且靜態(tài)成員在代碼編譯時(shí)就分配了內(nèi)存空間,而非靜態(tài)成員只有在編譯后才分配內(nèi)存空間,所以靜態(tài)成員無法調(diào)用非靜態(tài)成員,因?yàn)榉庆o成員有可能當(dāng)時(shí)還沒有生成。且只有當(dāng)程序完成后才會(huì)釋放空間。所以靜態(tài)類型占用內(nèi)存。

一般在你想做一個(gè)工具類時(shí),即大家都會(huì)經(jīng)常用到的類時(shí),才會(huì)寫成靜態(tài)類。

 

非靜態(tài)類中:

1)、在非靜態(tài)類中,既可以有實(shí)例成員,也可以有靜態(tài)成員。

2)、在調(diào)用實(shí)例成員的時(shí)候,需要使用對象名.實(shí)例成員;

    在調(diào)用靜態(tài)成員的時(shí)候,需要使用類名.靜態(tài)成員名;

總結(jié):靜態(tài)成員必須使用類名去調(diào)用,而實(shí)例成員使用對象名調(diào)用。

           靜態(tài)函數(shù)中,只能訪問靜態(tài)成員,不允許訪問實(shí)例成員。

     實(shí)例函數(shù)中,既可以使用靜態(tài)成員,也可以使用實(shí)例成員。

   

靜態(tài)類中:

 

只能有靜態(tài)成員,不能出現(xiàn)實(shí)例成員。

靜態(tài)類不能被實(shí)例化。

 

5、構(gòu)造函數(shù)

構(gòu)造函數(shù)的作用是初始化類。

構(gòu)造函數(shù)不能有返回值,連void也不行。

構(gòu)造函數(shù)名和類名一樣。

靜態(tài)構(gòu)造函數(shù):

主要為類的靜態(tài)字段進(jìn)行初始化

一個(gè)類只能有一個(gè)靜態(tài)構(gòu)造函數(shù),且不得帶參數(shù),不能有訪問修飾符,如public

 

6、析構(gòu)函數(shù)

 

7this

表示當(dāng)前類的對象,類不占內(nèi)存,但對象占內(nèi)存。

只能用在:實(shí)例構(gòu)造函數(shù)、實(shí)例方法以及屬性和索引器的實(shí)例訪問器。

 

8partial部分類

在一個(gè)類中可以寫兩個(gè)完全相同的類,并且類與類之間的所有數(shù)據(jù)都可以共享,你就可以把他當(dāng)成一個(gè)類,只是有兩個(gè)地方。類名前加上關(guān)鍵字partial

9、sealed密封類

不能夠被其他類繼承,但是可以繼承于其他類。

Public sealed class preosn()

{};

 

 

七、繼承

1、子類繼承的內(nèi)容:

(1)子類繼承了父類的public字段、屬性和方法,但是子類并沒有繼承父類的私有字段。

(2)子類不繼承父類的構(gòu)造函數(shù),但調(diào)用父類的無參構(gòu)造函數(shù),以創(chuàng)建父類對象,以使子類可能使用父類中的成員。所以,如果在父類中重新寫了一個(gè)有參數(shù)的構(gòu)造函數(shù)之后,那個(gè)無參數(shù)的就被干掉了,子類就調(diào)用不到了,所以子類會(huì)報(bào)錯(cuò)。

解決辦法:

在父類中重新寫一個(gè)無參數(shù)的構(gòu)造函數(shù)。

在子類中顯示的調(diào)用父類的構(gòu)造函數(shù),使用關(guān)鍵字:base()

2、繼承的特性

繼承的單根性,一個(gè)子類只能有一個(gè)父類。

繼承的傳遞性,從父類繼承的內(nèi)容,可以被自已的子類繼承。

3、  object是所有類的基類

 

4、  語法:

 

Public class 類名:父類名   //注意,這里的修飾符要比父類的一致,或比父類的權(quán)限小,不能比父類的權(quán)限大。

 

5、  如果子類有與父類一樣的方法,將隱藏父類的方法,即把父類覆蓋了。

6、  要顯示的隱藏父類中的方法,可以在子類的方法名前加關(guān)鍵字new.

7、子類的實(shí)例化對象可以賦值給父類的實(shí)例化對象。但父類的不能賦值給子類。

 

八、多態(tài)性

 

 

1、  虛函數(shù)

(1)    語法

在基類中把虛函數(shù)加上關(guān)鍵字virtual,在子類中在函數(shù)前加上關(guān)鍵字override

例:

Public class animal

{

Public virtual void test ()   //基類中聲明時(shí)加上關(guān)鍵字,聲明成虛函數(shù)。

{

Console.writeline(“我是父類的”)

}

}

 

Public class cat:animal

{

  Publicoverride void test()//子類中加上override重寫虛函數(shù)。這里也可以不加,但不加的話就要加上關(guān)鍵字new,把父類的函數(shù)隱藏。即子類可以重寫父類的虛方法,也可以不重寫。

 

{

Console.writeline(“我是子類的”)

}   

 

 

Animal aa=new cat();   //把子類對象賦值給父類對象。

 

aa.test();  //調(diào)用子類中的test方法。執(zhí)行過程如下:

 

程序執(zhí)行到此處,跳轉(zhuǎn)到父類的test函數(shù)上,但不執(zhí)行父類的函數(shù)體,接著就跳到子類cat test函數(shù)上,并且執(zhí)行函數(shù)體。  即此處aa對象賦的是哪個(gè)類的對象值,就執(zhí)行哪個(gè)類中的虛函數(shù)。

 

2)虛函數(shù)的作用

子類繼承了虛函數(shù)后,子類可以重寫虛函數(shù),也可以不重寫,實(shí)現(xiàn)多態(tài)性。

當(dāng)父類的虛函數(shù)的實(shí)現(xiàn)也有作用時(shí),用虛函數(shù)。子類繼承了虛函數(shù)后重寫虛函數(shù)。

虛函數(shù)就是用

3)注意事項(xiàng)

子類中的虛函數(shù)要和父類的一致,即子類中的虛函數(shù)和父類中虛函數(shù)的返回值,類型,參數(shù)都要一致。

 

 

2、  抽象類

(1)    語法:

父類:

public Abstract  class animal             //在抽象類前面加上abstract關(guān)鍵字。

{

Public Abstract void test(int i);         // 抽象方法前面也加上abstract關(guān)鍵字。修飾符不能是private。抽象方法是不能有方法體的,連大括號都不能有。所有的抽象成員在子類中必須被重寫。

Public void sum()                 //抽象類中允許有非抽象方法和非抽象字段,屬性。

{   }

}

Animal dog=new animal();       //這是錯(cuò)誤的,抽象類是不能被實(shí)例化的。

 

子類:

 

Public class cat:animal

{

Public Override void test(int j)       //子類中用override重寫抽象方法,且父類中的所有抽象成員必須在子類中重寫。

 {   }

public Override num()            //這種寫法是錯(cuò)的,抽象方法只能出現(xiàn)在抽象類中。除非子類也是抽象類。

{   }          

}

(2)    注意事項(xiàng):

1.抽象成員必須標(biāo)記為abstract,并且不能有任何實(shí)現(xiàn)。

2.抽象成員必須在抽象類中。

3.抽象類不能被實(shí)例化

 

4.子類繼承抽象類后,必須把父類中的所有抽象成員都重寫。

(除非子類也是一個(gè)抽象類,則可以不重寫)

 

5.抽象成員的訪問修飾符不能是private

6.在抽象類中可以包含實(shí)例成員。

并且抽象類的實(shí)例成員可以不被子類實(shí)現(xiàn)

 

7.抽象類是有構(gòu)造函數(shù)的。雖然不能被實(shí)例化。

8、子類重寫父類的虛函數(shù)時(shí),必須與父類一致,即返回值類型,參數(shù)及參數(shù)類型都要保持一致。

--------------------------------------------------------------------------------------------------------------------------------

如果父類中的方法有默認(rèn)的實(shí)現(xiàn),并且父類需要被實(shí)例化,這時(shí)可以考慮將父類定義成一個(gè)普通類,用虛方法來實(shí)現(xiàn)多態(tài)。

 

如果父類中的方法沒有默認(rèn)實(shí)現(xiàn),父類也不需要被實(shí)例化,則可以將該類定義為抽象類。

 

 

 

3、  接口

 

(1)      語法:

 

Public interface ikoulan

{

Void koulan();   //接口中的函數(shù)和抽象函數(shù)一樣,不能有方法體。繼承接口的子類,必須實(shí)現(xiàn)接口中的所有成員。接口不能被實(shí)例化。前面不能加修飾符,默認(rèn)是public.

String daqui(); //接口中只能有方法、屬性、索引器、事件成員,不能有構(gòu)造函數(shù)和字段。

}

 

 

Public class prson:ikoulan

{

Public void koulan()  //這是prson類已有的函數(shù)。當(dāng)人類里面已有一個(gè)koulan函數(shù)時(shí),就要另外顯示的實(shí)現(xiàn)接口函數(shù),在函數(shù)前加上接口名。

{

}

Void ikoulan:koulan()                       //一定要實(shí)現(xiàn)接口中的成員。因?yàn)樽宇愔幸延邢嗤暮瘮?shù)名,所以在這里顯示的加上接口名。如沒有得復(fù)不用加接口名。

{

Console.writeline(“高個(gè)可以扣籃”);

}

 

}

 

 

main函數(shù)中:

Ikoulan test=new prson();  //接口不可以實(shí)例化,但是可以把子類的對像賦值給接口對象。

 

(2)      用法

當(dāng)想多繼承時(shí),就需要用到接口,因?yàn)轭愂菃卫^承的,只能用接口來實(shí)現(xiàn)多繼承。

接口就是一種規(guī)范,能力。

接口與接口之間可以繼承,并且可以多繼承,即一個(gè)接口可以繼承多個(gè)接口。

接口并不能去繼承一個(gè)類,而類可以繼承接口  (接口只能繼承于接口,而類既可以繼承接口,也可以繼承類)

當(dāng)幾個(gè)類提取不出來一個(gè)父類,但有一個(gè)共同的行為時(shí),用接口。

當(dāng)幾個(gè)類能提取出一個(gè)父類,且有這幾個(gè)子類都必須執(zhí)行的方法,但是不知道這方法怎么實(shí)現(xiàn)時(shí),就用抽象類,實(shí)現(xiàn)多態(tài)性。

當(dāng)幾個(gè)類能提取出一個(gè)父類,且有這幾個(gè)子類都必須執(zhí)行的方法,且知道怎么實(shí)現(xiàn)這個(gè)方法,還想實(shí)例化父類時(shí),就用虛函數(shù)實(shí)現(xiàn)多態(tài)性。

 

(3)      注意事項(xiàng)。

 

八、集合與泛型

很多數(shù)據(jù)的集合,和數(shù)組類似。

數(shù)組長度不可變,類型單一。

集合的長度可以任意改變,類型隨便。

1、  Arraylist

方法:

(1)      ADD方法:把單個(gè)元素添加到集合中。

 ArrayList list=new ArrayList();

  List.Add(1);          //添加整型數(shù)據(jù)到List集合

 List.Add(“張三”);     //添加字符串到List集合

 List.Add(new int[]{1,2,3,4,5}); //添加數(shù)組到List集合。此時(shí)如果遍歷List時(shí),會(huì)顯示數(shù)組的命名空間名字,而不會(huì)顯示數(shù)組中的元素。要解決這個(gè)問題,要用addrange方法。

      

(2)    AddRange方法用于添加一批元素到當(dāng)前列表的末尾

List.AddRange(new int[]{1,2,3,4,5}); //添加數(shù)組到List集合。

List.AddRange(list);           //把自已添加到自已的集合里面。

(3)    Remove方法用于刪除單個(gè)元素,通過元素本身的引用來刪除

List.Remove(“張三”);     //寫誰就刪誰。

(4)    RemoveAt方法用于刪除一個(gè)元素,通過索引值來刪除,即下標(biāo)。
List.RemoveAt(0);      //
會(huì)刪除List.Add(1)中的1,他是第List中的第一個(gè)元素。

(5)    RemoveRange用于刪除一批元素,通過指定開始的索引和刪除的數(shù)量來刪除

List.RemoveRange(03);  //刪除list中第1個(gè)元素開始后的三個(gè)元素。

(6)    Insert在指定的索引位置插入元素,列表后面的元素依次往后移動(dòng)

List.Inset3,“李四”); //在第4個(gè)元素后插入字符串李四。

(7)    InsertRange在指定的索引位置插入一批元素(在集合中插入集合),列表后面的元素依次往后移動(dòng)

List.InsetRange(1,new string[]{“王五”,趙六”,”李七”}); //在第2個(gè)元素后插入字符串?dāng)?shù)組。

(8)    Clear方法用于清除現(xiàn)有所有的元素

(9)    Contains方法用來查找某個(gè)對象在不在列表之中,即判斷集合中是否包含指定的元素。

Bool a=list.contains(“李七”);   是否包含李七,包含為1,不包含為0,即假。

(10)  sort升序排列集合,但要求集合中的元素的類型基本一致才可行。

(11)  count:表示集合中實(shí)際包含的元素的個(gè)數(shù)

(12)  capacity:集合中可以包含的元素的個(gè)數(shù)。當(dāng)實(shí)際包含的元素個(gè)數(shù)超過可包含的元素個(gè)數(shù)時(shí),集合會(huì)向內(nèi)存中申請多開辟一倍的空間來保證集合的長度一直夠用。

13)遍歷arraylist集合:

For(i=0;i<list.count;i++)   //list.count表示集合的長度

{

Console.writeline(list[i]);

}

2、hashtable  鍵值對集合,類似于字典,根據(jù)鍵找到值,鍵和值一一對應(yīng)。

(1)  方法:

Hashtable ht=new hashtable();

Ht.Add(1,”張三”);       //添加值到集合中

Ht.Add(2,”李四”);

Ht.Add(false,”錯(cuò)誤”);  //鍵是false

Ht[true]=”正確”;      //也可以通過賦值方法來添加元素到集合中。

Console.writeline(ht[1]);  //打印出鍵為1的值,會(huì)顯示出 張三

Ht.clear();            //清除所有元素

Ht.remove(3);        //根據(jù)鍵來清除單個(gè)元素。

 2)遍歷集合

Foreach(var item in htlist)      //foreach循環(huán)來遍歷hashtable集合。

 

Foreach(var item in ht.keys)  //keys屬性是指hashtable集合的鍵,即遍歷整個(gè)集合的鍵

{

Console.writeline(“鍵是{0},值是{1}”,item,ht[item]);  //同時(shí)顯示鍵和值。Item代表了鍵,而ht[item]代表了每個(gè)鍵對應(yīng)的值。

}

3)鍵值對集合中鍵必須唯一

鍵值對集合中,鍵必須是唯一的,值可以重復(fù)。所以添加元素到集合中時(shí),先判斷鍵是否已存在。

If(ht.containsky(“true”))   //如果ht集合中已包含鍵true

 

3、  list泛型集合

1)泛型集合的要點(diǎn):

要指定集合的類型,集合中的元素都要是這個(gè)類型的。

arraylist的不同之處就是要指定元素的類型,其他方法基本一樣。

List泛型集合可以轉(zhuǎn)換成數(shù)組,數(shù)組也可以轉(zhuǎn)換成集合。

2)建立list集合對象:

List<int> list=new list <int>();   //聲明一個(gè)List集合,<>號中指定元素的類型。

 

3)集合轉(zhuǎn)數(shù)組和數(shù)組轉(zhuǎn)集合

   Int[] num=List.toarray();    //toarray方法把list集合轉(zhuǎn)換成數(shù)組,轉(zhuǎn)換成什么類型的數(shù)組取決于你是什么類型的集合。

 

   Char[]chs =new char[]{‘a(chǎn)’,’b’,’c’};

   List<char>listchar=chs.ToList();   //ToList方法把數(shù)組轉(zhuǎn)換成集合。

 

4、  字典集合

(1)    字典集合的要點(diǎn):

hashtable集合使用方法完全一致,只是鍵和值指定了類型

鍵也必須是唯一的

 

2)建立字典集合對象

Dictionary<int,string>dic=newDictionary<int,string>();

 

(3)兩種遍歷方法

方法一:

Foreach(var item in dic.keys)

{

Console.wirteline(“鍵是{0},值是{1}”,item,dic[item]);

}

     方法二:

   Foreach(keyValuePair<int,string>kv in dic)   //keyvaluepair表示鍵值對,既表示鍵也表示值,所以這種方法可以讓鍵和值一起顯示。

{

console.writeline(“鍵是{0},值是{1}”kv.key,kv.value);

}

 

九、轉(zhuǎn)換

1、裝箱、拆箱

裝箱:將值類型轉(zhuǎn)換成引用類型。

拆箱:把引用類型轉(zhuǎn)換成值類型。

 

2、里氏轉(zhuǎn)換

1)子類可以賦值給父類。

父類:

Public class person

{

  Publicvoid sayhello()

  {

    Console.writeline(“我是中國人”);

  }

}

子類一:

Public class hubie:person

{

  Publicvoid sayhello()

  {

    Console.writeline(“我是湖北人”);

  }

}

子類二:

Public class jiangsu:person

{

  Publicvoid sayhello()

  {

    Console.writeline(“我是江蘇人”);

  }

 

主函數(shù):

 

Person china=new hubei();    //把子類對象賦值給父類。如果有一個(gè)地方需要父類作為參數(shù),可以用一個(gè)子類對象代替。

 

 

 

2)如果父類中裝的是子類對象,可以將這個(gè)父類強(qiáng)轉(zhuǎn)為子類。

 

jiangsu js = (jiangsu)china;  //父類對象中裝的是哪一個(gè)子類成員,才能轉(zhuǎn)換成哪個(gè)子類的。這里的父類對象china前面被賦的值是hubei子類的,所以要強(qiáng)轉(zhuǎn)成jiangsu子類的,會(huì)出錯(cuò)。

 

            hubie hb = (hubie)china;//這個(gè)會(huì)成功。

3IS

if (china isjiangsu)   //is的作用是,如果轉(zhuǎn)換目標(biāo)成功,則返回一個(gè)true. 先判斷再轉(zhuǎn),避免拋異常。

            {

                jiangsu js = (jiangsu)china;   

            }

 

            else

            {

                Console.WriteLine("轉(zhuǎn)換失敗");

            }

 

 

4AS

jiangsu js1 = china asjiangsu//作用是,如果轉(zhuǎn)換成功就繼續(xù)執(zhí)行,如果不成功剛返回值null。不會(huì)拋異常。這里js1的值就會(huì)是null.

 

十、委托

十一、反射

 

 

 

 

 

 

第二部分:文件、目錄及文件流的操作

  • 文件的操作

1、  創(chuàng)建文件

File.create(@”c:\test\test.txt”).close();    //@是去除轉(zhuǎn)義符。建好后就關(guān)閉,否則如果后面要寫入內(nèi)容就會(huì)出錯(cuò)。

2、  刪除文件

File.Delete(@”c:\test\test.txt”);   

3、  復(fù)制文件

File.Copy(@”C:\test\test.txt”,@”c:\test\new.txt”); //復(fù)制文件并更名。

4、  移動(dòng)文件或重命名

File.Move(@"d:\site\file\test7.txt", @"D:\site\file\newfile\test7.txt");

 

5、判斷

if(File.Exists(@"d:\site\file\my.txt"))       //判斷文件是否存在,如果存在先刪除再建立。不存在,直接建立。

           {

               File.Delete(@"d:\site\file\my.txt");

               File.Create(@"d:\site\file\my.txt").close();

           }

            else

            {

                File.Create(@"d:\site\file\my.txt").close();

}

6、讀取文件

(1)   File.ReadAllText(path); //讀取文件中的內(nèi)容,但把所讀到的所有內(nèi)容當(dāng)一個(gè)字符串處理。返回值是字符串,不是字符串?dāng)?shù)組和集合。

(2)   File.ReadAllLines(path);//讀取文件中的內(nèi)容,但把每一行當(dāng)一個(gè)字符串,返回值是一個(gè)字符串?dāng)?shù)組。

7、寫入數(shù)據(jù)  //寫入數(shù)據(jù)會(huì)覆蓋原有的數(shù)據(jù)

1File.WriteAllLines(path,string[]);  //path是文件路徑,string[]是要寫入的字符串?dāng)?shù)組,一定要是數(shù)組。

2File.WriteAllText(path, string);  //path是文件路徑,string是要寫入的字符串。

 

8、追加數(shù)據(jù)  //追加數(shù)據(jù)是添加在后面,不會(huì)覆蓋原有數(shù)據(jù)。

1File.AppendAllLines(path,string[]);  //path是文件路徑,string[]是要寫入的字符串?dāng)?shù)組,一定要是數(shù)組。

2File.AppendAllText(path,string); //path是文件路徑,string是要寫入的字符串。

9、設(shè)定文件屬性

File.SetAttributes(path,FileAttributes.ReadOnly);//可以設(shè)置文件屬性為只讀,可寫,隱藏等。

 

10、綜合例:

 

staticvoid Main(string[] args)

        {

            string path = @"d:\site\file\my.txt";  //把常用的路徑定義成一個(gè)字符串。

            string all = "";       //為遍歷字符串拼接字符串賦一個(gè)空字符串。一定要先賦值。

           if(File.Exists(@"d:\site\file\my.txt"))       //如果文件存則為真,不存在為假

           {

               File.Delete(@"d:\site\file\my.txt");   

               File.Create(@"d:\site\file\my.txt").Close();//文件如存在,就先刪掉此文件,馬上再建一個(gè),建好后馬上關(guān)閉。

           }

            else

            {

                File.Create(@"d:\site\file\my.txt").Close();//如果文件不存在就直接建一個(gè)。

              

            }

 

string test= File.ReadAllText(@"d:\site\file\test.txt",Encoding.Default);

//讀取另一個(gè)文件中的內(nèi)容,存為一個(gè)字符串。

          string[] test1 = File.ReadAllLines(@"d:\site\file\test.txt", Encoding.Default); //讀取另一個(gè)文件中的內(nèi)容,存為一個(gè)字符串?dāng)?shù)組。

          File.AppendAllLines(path, test1);  //把字符串?dāng)?shù)組作為內(nèi)容添加到path路徑所指文件中,即my.txt中。如此時(shí)把test1換成test會(huì)報(bào)錯(cuò),因?yàn)?/span>test只是一個(gè)字符串,不是一個(gè)數(shù)組.

          File.AppendAllText(path, test);    //把字符串添加到my.txt中。

          File.AppendAllText(path, "我是一個(gè)北方的狼");

          string[] s = File.ReadAllLines(@"d:\site\file\my.txt");  //讀取my.txt中的內(nèi)容,并賦值給一個(gè)字符串?dāng)?shù)組。

          foreach (var item in s) //遍歷字符串?dāng)?shù)組

          {

 

              all += item.ToString();  //把字符串?dāng)?shù)組拼接成一個(gè)字符串。

 

          }

          //File.WriteAllLines(@"d:\site\file\test1.txt",s);   //把字符串?dāng)?shù)組的內(nèi)容寫入test1.txt中,原來的文件內(nèi)容會(huì)被覆蓋。

          //File.WriteAllText(@"d:\site\file\test.txt","我會(huì)覆蓋你原來的內(nèi)容");//把字符串的內(nèi)容寫入test1.txt中,原來的文件內(nèi)容會(huì)被覆蓋

           Console.WriteLine(all);

           Console.ReadKey();   

    }

 

 

 

 

     

  • 目錄操作

1、path類(路徑的操作)

String str=@”d:\site\loready\p_w_picpath\3.jpg”;

Console.writeline(Path.GetFileName(str));   //獲取路徑中的文件名,顯示為3.jpg

Console.writeline(Path.GetFileNameWithoutExtension(str));//獲取文件名,但不包含拄展名,顯示為3。

Console.writeline(Path.GetExtension(str));  //獲取擴(kuò)展名,顯示為jpg

Console.writeline(Path.GetDirectoryName(str)); //獲取文件夾的名稱,顯示為d:\site\loready\p_w_picpath

Console.writeline(Path.GetFullPath(str));   //獲取全目錄,即顯示為d:\site\loready\p_w_picpath\3.jpg

Console.writeline(Path.Combine(@”c:\a\”,”b.txt”));  //連接兩個(gè)字符串作為路徑,顯示為c:\a\b.txt

其他方法見MSDN

 

2、目錄的操作

Directory

Directory.Delete(@"d:\site\file\file_dir”) //刪除一個(gè)目錄

Directory.Move(@"d:\site\file\file_dir1",@"d:\site\file\file_dir");//移動(dòng)一個(gè)目錄到另一個(gè)目錄,前面是源目錄,后面是目的目錄路徑

            if(Directory.Exists(@"d:\site\file\file_dir"))//判斷目錄是否存在

            {

               string[]s=Directory.GetFiles(@"d:\site\file\file_dir");

//getfiles是獲取目錄下的文件及路徑。

               for (inti = 0; i < s.Length; i++)

               {

                   dir += s[i];

                   

                  

                }

            }

            else

            {

               Directory.CreateDirectory(@"d:\site\file\file_dir");//創(chuàng)建一個(gè)目錄

            }

            Console.WriteLine(dir);

            Console.ReadKey();

 

要想復(fù)制目錄,思路是用遞歸的方法遍歷源目錄下的所有目錄及文件,把這些目錄和文件再復(fù)制到另一個(gè)地方。

 

 

 

 

  • 文件流操作(用于操作大文件)

 

把大文件碎片化操作,一塊一塊操作,而FILE類,則是文件一次性操作。

1、  Filestream(操作字節(jié)的,任何文件都可以操作)

1)讀取數(shù)據(jù)

FileStream fs=newFileStream(@"d:\site\file\test.txt",FileMode.OpenOrCreate, FileAccess.Read);//第一個(gè)參數(shù)是要操作文件的路徑;第二個(gè)參數(shù)是對文件的操作模式,是打開(Open),創(chuàng)建(Create),還是追加(Append)OpenOrCreate是如果文件不存在就創(chuàng)建并打開,如果文件存在就直接打開;第三個(gè)參數(shù)是對文件里的數(shù)據(jù)進(jìn)行的操作,是讀(fileaccess.read),還是寫(fileaccess.write)。

byte[] buffer=newbyte[1024*1024*1];//建立一個(gè)字節(jié)數(shù)組,并指定一次性讀取文件的大小,這里為1M。

 int r=fs.Read(buffer, 0, buffer.Length);   //第一個(gè)參數(shù)是指把讀取到的內(nèi)容存到buffer字節(jié)數(shù)組中,第二個(gè)參數(shù)是從哪里開始寫入數(shù)據(jù),0即是開始位置,buffer.length即表示每次最多讀取數(shù)據(jù)的大小,即1M。返回的int類型值,是指讀取到的字節(jié)數(shù)。

string s = Encoding.Default.GetString(buffer,0,r);  //把存放在字節(jié)數(shù)組中的數(shù)據(jù)流解碼成字符串。0是從流的0位置開始解碼,r是指解碼的字節(jié)數(shù)。這樣就會(huì)只解碼剛才讀的部分。

fs.Close();    //c#無法自動(dòng)釋放數(shù)據(jù)流,所以要先關(guān)閉數(shù)據(jù)流,再用dispose()釋放流。

 fs.Dispose();

 Console.WriteLine(s);

 

 

2)寫入數(shù)據(jù)

using (FileStream fswrite = newFileStream(@"d:\site\file\test.txt", FileMode.OpenOrCreate, FileAccess.Write))   //using中會(huì)自動(dòng)釋放流的資源。此處最后一個(gè)參數(shù)改成了寫的狀態(tài)。

   {

   string w = "我們的家在松花家上啊,那里有大豆高粱";

   byte[] buffer1 = Encoding.Default.GetBytes(w);    //把要寫入的字符先轉(zhuǎn)換成數(shù)據(jù)流,然后存入buffer1字節(jié)數(shù)組中。

  fswrite.Write(buffer1,0,buffer1.Length);           //第一個(gè)參數(shù)是字符數(shù)組,第二個(gè)參數(shù)是從哪里寫入,第三個(gè)參數(shù)是寫入的最大長度。

    Console.WriteLine("寫入OK");

Console.ReadKey();

 

 

2、  streamreaderstreamwriter(操作字符的,即文本文件)

每次只讀文本中的一行,要讀完就要循環(huán)到文本的最后一行。

讀:

Using(streamreader sr=new streamreader(@”d:\site\file\test.txt”,encoding.default)

{

While(!sr.endofstream)  //如果沒讀到文本的行尾

{

Console.writeline(sr.readline());  //就不停的讀下一行并顯示出來。

}

}

寫:

Using(streamwriter sw=new streamwrite(@”d:\site\file\test.txt”,true)  //true表示追加到原文本后面,不會(huì)覆蓋原文本。

{

Sw.write(“要寫入的字符”);

}

 

第三部分:字符串操作、編碼及正則表達(dá)式

一、字符串操作

字符串是引用類型且字符串對象是不可變的:即它們創(chuàng)建之后就無法更改,不能依據(jù)其堆中的存儲(chǔ)地址找到它然后更改它。

如:string s=”123”;此時(shí)s在棧中指向堆中123的地址空間。

string s=”456”;此時(shí)對S重新賦值,但不會(huì)像其他類型一樣,456會(huì)存到123原有的地址空間,替換掉123,而是在堆中重新開辟一個(gè)空間存值 456,且把s在棧中指向的地址改向456的地址。原來123在堆中仍然存在,并沒有消失。

示例:

字符串的下標(biāo)索引位是從0位開始。

String s=”abc_def”  //聲明字符串

String b=”efg”

1、  計(jì)算字符串

s.Length  //字符串長度,返回的是整數(shù)。

2、  截取字符串

s.Substring(startend) //從字符串的第幾位到開始到第幾位結(jié)束間的所有字符串,可以只有start或只有end。從0位開始計(jì)算。

Cosole.writeline(s.substring(1,5)); //顯示結(jié)果為:bc_de

3、  分割字符串

s.Split(“分隔符”)//用分隔符把字符串分成多個(gè)字符串,返回字符串?dāng)?shù)組

string[] test=s.split(‘_’);   //s字符串用_分成兩個(gè)字符串,即字符串組,注意是單引號。

console.writeline(test[0]); //顯示為abc

console.writeline(test[1]); //顯示為def

 

4、  替換字符串

s.replace(“source_string”,”replace_string”) //用后面的字符串替換掉前面的字符串。

    console.writeline(“abc”,”ABC”);  //顯示為ABC_def 

5、  比較字符串

s.Equals(b)  //比較兩個(gè)字符串是否相同,如果相同則返回ture,否則返回false。S字符串和b字符串不一樣,所以返回值為ture。

 

6、  轉(zhuǎn)換字符串

s.ToLower()  //把字符串轉(zhuǎn)換成小寫

s.ToUpper()  //把字符串轉(zhuǎn)換成大寫

7、  插入和刪除字符串

(1)s.Insert(start要插入的字符串”);  //從第幾位開始把后面的字符串插入到字符串中。

(2)s.Remove(start,end) //刪除字符串中從start位開始到end位結(jié)束的字符??梢灾挥?/span>start或只有end

console.writeline(s.insert(4,b);  //顯示為 abc_efgdef ,從第四位開始插入字符串b變量中的內(nèi)容。

8、  匹配索引和包含判斷

s.IndexOf(“bc”)// 從字符串頭部開始搜索第一個(gè)匹配“bc”的在字符串中的位置索引。如果沒有匹配,輸出為-1。此如出顯示出來,索引值為1,bc的開始下標(biāo)為1開始。

s.Lastindexof(“de”)//從字符串尾部開始搜索第一個(gè)匹配“de”的位置索引。此處如顯示出來,索引值為4。

s.Contains("def")//判斷字符串中是否包含字符串"def",有輸出ture,沒有輸出false.此處返回為ture。

9、  連接字符串

string[] arr = s.Split(‘_’);   //把字符串s用下劃線分隔成兩個(gè)字符串。這里是單引號。

此時(shí)arr[0]=”abc”;

   Arr[1]=”def”;

(1)      String.Join(“分隔符”,字符串?dāng)?shù)組名)  //把一個(gè)字符串?dāng)?shù)組連成一個(gè)字符串,用分隔符隔開。

Join(“分隔符”,字符串,字符串,字符串……) //把字符串連接成一個(gè)字符串,用分隔符隔開。

 

 

2String.Concat(字符串?dāng)?shù)組名)   //把字符串?dāng)?shù)組,連成一個(gè)字符串。 

String.Concat(字符串,字符串,….. //把字符串連成一個(gè)字符串。

 

例:

String s=”abc_def”

string[]arr = s.Split('_'); //分割成兩個(gè)字符串

           

            stringtest=string.Join(",",arr);//用分隔符逗號把arr字符串?dāng)?shù)組中的字符串連接到一起。

Console.WriteLine(test); //顯示為abc,def

            Console.WriteLine(string.Concat("qf","ef",”mf”));//顯示為gfefmf

             Console.ReadKey();

Joinconcat的區(qū)別,只是一個(gè)有分隔符,一個(gè)沒有。

 

(3)      StringBuilder

StringBuilder sb =newStringBuilder(); //定義一個(gè)類對象。

sb.Append(s);   //把字符串變量s中的內(nèi)容添加到sb對象中。

sb.Append(b);  //把字符串變量b中的內(nèi)容添加到sb對象中。

Console.writeline(sb.tostring()); //再把sb對象轉(zhuǎn)換成字符串輸出顯示為abc_defefg

 

 

二、字符編碼

 

編碼:將字符串用怎樣的形式保存為二進(jìn)制。

Asc: 128  主要是美國用,英文和數(shù)字。

Ascii: 256  歐州用

Gb2312   國標(biāo),中國用,簡體字

Big5      繁體字

Unicode   很全,世界上的編碼都包含,全世界都能用,但太大了,會(huì)慢。

Utf-8      世界通用,主要用于web

 

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI