雖然用了這麼久的C#,用會用,但有些東西為什麼這麼用就不瞭解了。所以,決定持續鞏固梳理基礎~~~
1.棧:棧是一個記憶體數組.
2.堆:堆是一塊記憶體地區.
3.實值型別:儲存在棧中.
4.參考型別:存數在堆中.
5.類:類是一個可以儲存資料並執行代碼的資料結構.
6.方法:
/*****************
方法是具有名稱的可執行代碼塊.可以使用方法名稱從別的地方執行代碼,也可把資料傳入方法並接受資料輸出.
方法有兩個主要部分,方法頭和方法體.
方法頭指定方法的特徵,方法是否返回資料,如果返回,返回什麼類型.
方法體包含可執行代碼的語句.
*****************/
7.存取修飾詞:
/*****************
public:公有,同一程式集中的任何其他代碼或引用該程式集的其他程式集都可以訪問該類型或成員.
private:私人,只有同一類或結構中的代碼可以訪問該類型或成員.
internal:內部,同一程式集中的任何代碼都可以訪問該類型或成員,但其他程式集中的代碼不可以.
protected:受保護,只有同一類或結構或者此類的衍生類別中的代碼才可以訪問的類型或成員.
protected internal:受保護內部的,由其聲明的程式集或另一個程式集派生的類中任何代碼都可訪問的類型或成員。 從另一個程式集進行訪問必須在類聲明中發生,該類聲明派生自其中聲明受保護的內部元素的類,並且必須通過派生的類類型的執行個體發生.
*****************/
8.具名引數:
/*****************
位置不必再一一對應相應形參位置,用:方式可在任意位置定義
如:
int i = m.call(c:1,b:2,a:1);
public int call(a,b,c)
{return a+b+c;}
*****************/
9.靜態屬性:存在,不管類是否有執行個體,當從類的外部存取時,必須使用類名引用,而不是執行個體名。
10.執行個體建構函式:
/*****************
執行個體建構函式是一個特殊的方法,它在類的每個新執行個體建立的時候執行。
建構函式用於初始化類執行個體的狀態(在new一個類的對象時首先執行)。
*****************/
11.帶參數的建構函式:
/*****************
建構函式可以帶參數,可以被重載。
class C
{
int Id;
String Name;
public C(){Id=7777; Name="XXX";}
public C(int val){Id=val; Name="XXX";}
public C(String name){Name=name}
public void write()
{Console.WriteLine("ID:{0}, Name:{1}",Name,Id);}
}
class p
{
static void Main()
{
C x = new C(),
y = new C(5257),
z = new C("qiqi");
x.write();
y.write();
z.write();
}
}
輸出結果:
ID:7777, Name:XXX
ID:5257, Name:XXX
ID:0, Name: qiqi
*****************/
*Random函數:
/*****************
Random.Next() 返回非負隨機數;
Random.Next(Int) 返回一個小於所指定最大值的非負隨機數
Random.Next(Int,Int) 返回一個指定範圍內的隨機數
*****************/
12.this關鍵字:
/*****************
this關鍵字在類中使用,是對當前執行個體的引用.
用於區分類的成員和本地變數或參數.
用於調用方法的實參.
*****************/
12.隱藏基類的成員:
/*****************
雖然衍生類別不能刪除它繼承的任何成員,但它可以隱藏它們。
要隱藏一個整合的資料成員,需要聲明一個新的相同類型的成員,並使用相同的名稱。
要讓編譯器知道你在故意隱藏繼承成員,使用New修飾符。
可以隱藏靜態成員。
*****************/
*泛型例子:
/*****************
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class MyStack<T> { T[] StackArray; int StackPointer; public void Push(T x) { if(!IsStackFull) { StackArray[StackPointer++] = x; } } public T Pop() { return (!IsStackEmpty) ? StackArray[--StackPointer] : StackArray[0]; } const int MaxStack = 10; bool IsStackFull { get { return StackPointer >= MaxStack; } } bool IsStackEmpty { get { return StackPointer <= 0; } } public MyStack() { StackArray = new T[MaxStack]; } public void print() { int i = StackPointer-1; while (i >= 0) { Console.WriteLine("Value:{0}",StackArray[i]); i--; } Console.ReadLine(); } } class Program { static void Main(string[] args) { var stackInt = new MyStack<int>(); var stackString = new MyStack<string>(); stackInt.Push(3); stackInt.Push(5); stackInt.Push(7); stackInt.print(); stackString.Push("fanxing are great"); stackString.Push("hi there"); stackString.print(); } }}
*****************/
*擴充方法例子:
/*****************
View Code
1 public static class helper 2 3 { 4 5 public static string MD5Hash(this string s) 6 7 { 8 9 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");10 11 }12 13 14 15 public static bool In(this object o, IEnumerable b)16 17 {18 19 foreach(object obj in b)20 21 {22 23 if(obj==o)24 25 return true;26 27 }28 29 return false;30 31 } 32 33 }34 35 36 37 // 調用擴充方法38 39 Console.WriteLine("123456".MD5Hash());40 41 Console.WriteLine("1".In(new[]{"1","2","3"}));
很多時候我們需要對CLR類型進行一些操作,苦於無法擴充CLR類型的方法,只能建立一些helper方法,或者產生子類。擴充方法使得這些需求得意實現,同時也是實現LINQ的基礎。定義擴充方法需要注意,只能在靜態類中定義並且是靜態方法,如果擴充方法名和原有方法名發生衝突,那麼擴充方法將失效。摘自【http://www.cnblogs.com/lovecherry/archive/2007/08/14/855681.html】
*****************/