天天看點

C# 基礎文法

<a href="http://www.cnblogs.com/wenwei/archive/2011/10/14/2212351.html">http://www.cnblogs.com/wenwei/archive/2011/10/14/2212351.html</a>

一、c#基礎

1.控制台基本操作

Console控制台标準輸入、輸出流和錯誤流,此類不能繼承;下面的輸入、輸出都要通過他才能做到。

1)輸出:WriteLine是輸出一個值并換行,Write是輸出一個值不換行;

如:Console.WriteLine("hello"); Console.Write("hello");

2)輸入:ReadLine()讀取一行字元,Read()讀取下一個字元;如:string s= Console.ReadLine();

記住:無論你輸入的是數字還是字元,他都當成一個字元串來處理;

如果想輸入數字就要轉換他的類型:

 string i = Console.ReadLine();輸入一個數字字元

            int ii = Convert.ToInt32(i);将數字字元轉換為int型,不能将abc……字元轉換為int型;

            Console.WriteLine(ii*2);

3)占位符:用大括号表示“{參數}”,占位符從中的參數從0開始,我們後面有幾個值就用幾個占位符,占位符中的序号也是要跟着的,比如有三個值要輸出,那麼占位符就應該是:{0},{1},{2};

例如:

int i1 = 10;

int i2 = 21;

Console.WriteLine("{0}+{1}={2}", i1, i2, i1 + i2); //占位符"{0}+{1}={2}",其中的數字0,1,2,順序不能改變,我們要輸出三個參數,也隻能按順序012,不能用014,随便亂用,占位符的順序是從0開始的。

Console.WriteLine("{0}愛{1}",s,c);//還能在占位符之間加任意的字元串。

注:占位符中間寫什麼編譯器他不管,他隻管占位符{},其他的做一個字元串輸出。

4)轉義符:用反斜杠(\)作為轉義符,@轉義符的轉義符

string z = "\"abc\""; //我們想輸出(”abc”)不能這樣寫""abc"";,要用反斜杠将雙引号轉義告訴編譯器第

二個和第三個雙引号是我們要輸出的而不是用來“框”字元串的。

string y = "\\\\\\"; //如果我想輸出6個反斜杠,那麼這樣的話隻能輸出3個,因為每個反斜杠前面的那個反斜杠會變成一個轉義符,

string x = @"\\\\\jk";  //用@來将反斜杠轉義,在要輸出的字元串前面加上(@)說明字元串裡面的反斜杠不是用來做轉義用的,而是我們想要輸出的。

注:@隻能對反斜杠起作用對其他的符号不起作用。

5)Console.ReadKey();//當按下一個按鍵時繼續執行;如果這裡不加上這一句的話,運作控制台程式時就會一閃而過,根本看不到他輸出的是什麼。

6)字元串的轉換

Convert.ToInt32(參數);将參數轉換為int32型,

Convert.ToString(參數);将參數轉換為字元串;

Convert.ToBoolean(參數);将false,true字元串轉換為布爾型(既有判斷性質,而不是一個簡單的字元串)

7)兩個字元串相連

在c#要将兩個字元串相連,不用像c、c++裡面一樣需要用函數才能連接配接,直接用加号即可

如:string x=”abc”;

string y=def”

Console.WriteLine(x+y);結果為abcdef。

2.循環的中斷

1)continue結束本次循環;

continue陷阱:

int sum=0;

            while (sum&lt;100)

            {

                if (sum % 7 == 0)

                {

                    Console.WriteLine(sum);

                    sum++;//這裡就是continue的陷阱,因為當sum能被7整除的時候他就跳出本次循環,那麼下面的sum就不能自加1,當下一次循環的時候,sum還是上一次能被7整除的那個值,上一次能被7整除,如果這裡不自加的話,他将永遠被整除下去,這裡就陷阱所在。就是說你continue跳過本次循環,那麼你要為你跳過本次循環的後果負責,如果後果不要就的話那麼你可以不負責,顯然這個循環是要求負責的。

                    continue;

                }

                sum++;

            }

2)break跳出循環,如果循環語句遇到break,那麼就不在循環了,直接跳出循環執行循環外面的語句。

int max = 0;

            while (true)

                string s = Console.ReadLine();

                if (s =="end")

                    Console.WriteLine("最大值為:{0}",max);

                    Console.ReadKey();

                    break;// 直接跳出循環(或者說結束本次循環);                   

                int i = Convert.ToInt32(s);

                if (i &gt; max)

                    max = i;

            Console.WriteLine("如果if裡面用return,則不會執行到這裡來直接傳回主函數了");

            Console.ReadKey();

3)return傳回函數,直接跳出函數。

static void Retu()

{

 while (true)

                string s=Console.ReadLine();

                if (s == "q")

                    return;// 這個程式中while看上去是個死循環,但是在if這裡用了return,return是跳出整個函數(這裡直接跳出Retu這個函數,不往下執行),如果是跳出主函數,跳出了主函數就以為着程式結束了。

                else

                    int i = Convert.ToInt32(s);

                    Console.WriteLine(i*2);

                }               

}

注:1)continue;這個的意思是說跳出本次循環,比如這裡是執行100次,if(s=“10”)continue;那麼當執行到10的時候被跳過不執行然後接着執行11之後面的循環。而如果這裡換成break時,當執行到10的時候直接跳出while循環,不執行11後面的語句(但能執行while外面的語句)。

2)break,continue是用來終止循環的,而return是用來傳回函數值的,在有return的函數裡面,return後面的語句都不能被執行。

3)對于循環中又有循環,那麼break怎麼結束,continue又跳出的是哪個循環?答案就是與他跳出他最近的那個,就如同有多個if且隻有一個else,那麼else與那個比對呢,當然是與他最近的那個了。

3.類型轉換

将一種類型的值轉換為大小相等或更大的另一種類型時,所發生的轉換為擴大轉換(隐式轉換);

将一種類型的值轉換為較小的另一種類型時,所發生的轉換為縮小轉換(顯示轉換)

每種類型都有MaxValue,MinValue這兩個屬性值,用來檢視類型的最大值和最小值。

Console.WriteLine("int的最大值{0},int的最小值{1}",int.MaxValue,int.MinValue);

Console.WriteLine("byte的最大值{0},byte的最小值{1}", byte.MaxValue, byte.MinValue);

1)隐式轉換

 byte i = 3;

int j = i;// 小到大,系統自動将我的轉換了,不告訴我們,是以叫隐式轉換。

2)顯示轉換

byte i;

int z = 22;

i = (byte)z;// 從大到小,因為byte不能将int的值裝下是以要顯示轉換(也叫強制轉換),

如果這裡z=288因為byte最大值不能超過255,這樣的強制轉換就會溢出,産生一個不可預知的錯誤。

注意:這種轉換如果大資料類型的值(如z)在小資料類型所表示的範圍(byte表示範圍為-255—+255)内則不會出現問題,如果大于如果大資料類型的值超出小資料類型所表示的範圍(如int範圍可以達到20億多,而byte最大值為255,如果将int型資料大于255強制轉換為比他小的資料類型如byte型,那麼byte型不能将他裝下就會溢出,他所列印出來的值就是一個不可預知的值)

4.枚舉和數組

1)用enum來定義一個枚舉

enum Meiji{bao,wen,wei};//定義一個枚舉類型,并且指派;(和struck聯想一下其實也沒什麼的)

                      //枚舉和類這些類型的等級一樣,是以不能定義在類裡面,也不能定義在裡面;                                                       

    class Program

    {

        static void Main(string[] args)

        {

            Meiji m = Meiji.bao;

            Meiji x = Meiji.wei;

            Meiji x1 = Meiji.wen;

//m、x、x1被用枚舉類型Meiji來定義了,那麼m、x、x1的值就隻能等于Meiji裡面所有的值,而不能等于其他值。

            Console.WriteLine(m + "" + x + "" + x1);// 不能寫成這樣(m+x+x1),枚舉不能和+運算發在一起,字元串、數值可以,因為字元和int類型可以重新指派,而枚舉的值是固定的。            Console.WriteLine("{0}{1}{2}", m, x, x1);

             Console.ReadKey();

注:1)枚舉的意義就在于限定了變量的取值範圍;如果現在用枚舉來類型在定義變量,那麼被他所定義的變量隻能是枚舉裡面的值,不能賦其他的值; 如:Meiji y=Meiji.tianxia;這是錯誤的,因為Meiji裡面沒有tianxia這個值,是以不能用來指派給y;

2)當我們知道某些變量的取值範圍的時候,将他們“裝在”枚舉裡面會為我們省去很多不必要的麻煩,比如定義的時候超出了我們所要定義的範圍。

例2:

Enum能夠也能定義類型:

enum typeName:int

      var1=1,

      var2=2,

      var3=3

    }

            typeName i=typeName.var1;

            int j = Convert.ToInt32(i);

            Console.WriteLine(i);

            Console.WriteLine(j);

        }

2)數組

在c#中數組是對象,system名稱空間的Array類是所有c#數組的基礎,由于C#數組是對象,是以必須使用new操作符來執行個體化;在初次執行個體化數組時,也需要指明數組能容納的子項數量(指定數組的長度或者說大小)。

方法1:

string[] name = { "bao", "wen" };

int[] shuzu = {1,2,3,4};// C#的定義數組和c,c++不一樣,用的時候是一樣的shuzu[0],c中定義是int shuzu[]={1,2,3};            Console.WriteLine("數組的長度為{0}",shuzu.Length);// Length檢視數組的長度;

            for (int i = 0; i &lt; shuzu.Length;i++ )

                Console.WriteLine(shuzu[i]);

方法2:

string[] home = new string[3];

            home[0] = "bao";

            home[1] = "tian";

            home[2] = "wen";

            string s = "";//字元串必須先指派,如果不确定就用“”表示空字元串;            Console.WriteLine(home[0] + home[1] + home[2]);// 将三個字元串相連,如果是枚舉就不可以了。            for (int i = 0; i &lt; home.Length - 1; i++)// for中的變量i出來這個for就不起作用了,在for中定義的變量隻在for中起作用(這和c,C++不一樣c,c++中是如果出了for隻要在同一個函數中他都起作用);

                s = s + home[i] + "|";

            s = s + home[home.Length - 1];

            Console.WriteLine(s);

方法3:

//string[] home;

//home[1]=”bao”; 不能就這樣指派,不同于c,c++;

string[] arr;//先定義後執行個體化;

            arr = new string[5];//必須執行個體化後才能為他指派

            arr[0] = "bao";

            foreach (string ar in arr)

                Console.WriteLine(ar);

3)foreach周遊數組

          string[] names = {"bao","wen","wei"};

            foreach (string name in names)

                Console.WriteLine("我的名字叫{0}",name);

注:1)如果int[] i=new int[2];沒有為i數組指派,那麼他就預設為兩個0(i[0]=i[1]=0)

2)如果string[] s=new string[2];沒有為s數組指派,那麼他就預設為兩個空字元串””;(s[0]=s[1]=””)

3)如果Student[] st=new Student[2];沒有為st對象數組指派,那麼他就預設為兩個null.

對象中的null類似于int中的0(從意義上來說,在我們做判斷一個數組是否為空時還是要根據類型來說話);

4)c#中一切皆對象,是以就算是數組也必須先執行個體化(通過new來執行個體化)後才能為他指派;

4)ArryList

首先,它的大小是随着它所包容的元素的多少而動态變化的

其次,在ArrayList中可以很友善地把一個元素插入到指定的位置,也可以很輕松地删除一個元素。

但是,為了能夠提供這樣大的靈活性,ArrayList的效率與數組相比就要差一些。

•         (1) Add:向ArrayList中增加元素。

•         (2) Insert:在ArrayList的某個特定位置插入元素。

•         (3) Remove:删除ArrayList中的某個元素。

•         (4) RemoveAt:删除ArrayList中的某個特定位置的元素。

•         (5) IndexOf:傳回ArrayList中某個元素的索引。

•         (6) Reverse:将ArrayList中的元素倒排。

•         (7) Sort:将ArrayList中的元素排序。