<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<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 > 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 < 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 < 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中的元素排序。