C#學(xué)習筆記及方法
C#是一門(mén)面向對象的語(yǔ)言,具有面向對象的基本特征,抽象、封裝、繼承、多態(tài)等性質(zhì)。學(xué)習C#除了一些基本的語(yǔ)法,還得學(xué)習一些新的特性,比如說(shuō):泛型、多線(xiàn)程、集合、反射等,下面就選其中一些來(lái)學(xué)習吧!
一、C#中的各種器
A、 C#構造器-構造函數
如下:
復制代碼 代碼如下:
//構造器1
public Products(int id)
{
_Id = id;
}
//構造器2,使用this來(lái)調用構造器1
public Products(int id, string Name, string Band)
: this(id)
{
_ProductName = Name;
_ProductBand = Band;
}
靜態(tài)構造器-用來(lái)對類(lèi)進(jìn)行初始化信息,它不是顯示調用的,在首次訪(fǎng)問(wèn)類(lèi)時(shí)將自動(dòng)調用,用來(lái)初始化類(lèi)的一些基本信息而不是對象,但最好不要使用靜態(tài)的構造器,代碼如下:
復制代碼 代碼如下:
static Products() { }//靜態(tài)構造器
public Products() { }
B、初化器-在沒(méi)有帶參數的構造器時(shí),我們可以用初始化器對對象的共公屬性進(jìn)行初始化
如下:
復制代碼 代碼如下:
//產(chǎn)品的集合List
List
{
new Products() { _Id = 1, _ProductName = "whc" },//使用{}是調有用初始化器,對屬性進(jìn)行初始化
new Products() { _Id = 1, _ProductName = "whc1", _ProductBand = "ctbu" },
new Products() { _Id = 1, _ProductName = "whc2", _ProductBand = "ctbu" }
};
C、終結器
終結器是在一次對象最后一次活動(dòng)之后,并在程序終止之前執行。拉圾回收器會(huì )在回收過(guò)程中,找到帶有終結器的對象,然后加入到終結隊列,線(xiàn)程遍歷完了,就調用終結隊列上對象的終結器來(lái)回收資源
二、C#中那些重要的知識
A、委托與事件
委托
C#中將一個(gè)方法作為一個(gè)參數傳遞給其它方法使用,實(shí)現這樣功能的模式叫做委托
1、委托的類(lèi)型:是強類(lèi)型,因為在聲明委托方法時(shí),指定的參數,在調用這個(gè)委托時(shí)必須傳遞相同類(lèi)型的參數與參數個(gè)數
2、委托的內部機制:C#中所有的委托都繼承自System.Delegate,但是我們不能繼承它來(lái)實(shí)現自定義的委托,可以使用delegate關(guān)鍵字來(lái)定義
3、委托的定義:使用delegate關(guān)鍵字來(lái)使用
4、委托的實(shí)例化:定義一個(gè)與委托相同類(lèi)型的函數,作為委托的參數傳遞,不需要用new關(guān)鍵字進(jìn)行實(shí)例化,它可以通過(guò)委托推斷,在C#1.0中,在傳遞方法時(shí),需要用new delegate(Method)
5、委托的使用:
復制代碼 代碼如下:
class DelegateClass
{
//一個(gè)泛型的委托,可以不同類(lèi)型的參數進(jìn)行處理
public delegate void AlculateMethod
}
class MehtodConllection
{
public void AlculateAdd
{
string third = first.ToString() + second.ToString();
System.Console.WriteLine(third);
}
public void AlculateDelete(int first, int second)
{
System.Console.WriteLine(first - second);
}
public void AlculateAddOther
{
string third = first.ToString() + "Hello Word" + second.ToString();
System.Console.WriteLine(third);
}
}
private static void _Demo4()
{
//方法的集合
MehtodConllection mc = new MehtodConllection();
//泛型的委托聲明
DelegateClass.AlculateMethod
//添加委托方法
Demo += mc.AlculateAdd
//
Demo += mc.AlculateAddOther
//調用方法,所有在委托中的方法都能被執行
Demo("str", "sterte");
}
事件
事件是一種特殊的委托,在聲明委托時(shí),添加一個(gè)event關(guān)鍵字
步驟:
1、定義委托的類(lèi)型,相當于一個(gè)類(lèi),如: public delegate void ActionMethod();
2、定義事件委托變量,用1、中的委托類(lèi)型定義,如: public event ActionMethod amd;
3、調用定義的事件,觸發(fā)器,如:
復制代碼 代碼如下:
class Cat
{
//定義委托方法
public delegate void ActionMethod();
//聲明事件委托
public event ActionMethod amd;
//觸發(fā)事件
public void CatShout()
{
System.Console.WriteLine("貓叫了,事件觸發(fā)了。!");
amd();
}
}
4、向事件中添加方法,將方法與事件綁定在一起,以便在觸發(fā)時(shí)一起執行,如:
復制代碼 代碼如下:
private static void _Demo15() {
Cat cat = new Cat();
HostPerson hp = new HostPerson();
Mouse mouse = new Mouse();
cat.amd += mouse.runing;
cat.amd += hp.WeekUp;
cat.CatShout();
}
5、最后觸發(fā)事件
B、反射與特性
反射
1、反射的作用:
。1)、訪(fǎng)問(wèn)程序集中的元數據,比如說(shuō),方法屬性修鉓符
。2)、使用元數據,在運行時(shí)動(dòng)態(tài)的調用元數據的成員與屬性等,而不是在編譯時(shí)進(jìn)行綁定
2、反射是擇指對一個(gè)程序集中的元數據進(jìn)行檢查的過(guò)程,并且可以列舉程序集的類(lèi)型與屬性,以及使用一些特定的對象調用上面的成員
3、使用System.Type訪(fǎng)問(wèn)元數據
類(lèi)型的元數據System.Type是一個(gè)實(shí)例,這個(gè)實(shí)例提供了一些方法,這些方法可以列舉元數據的成員,主要方法有以下幾種:
Type.Name、Type.IsPublic、Type.BaseType、Type.GetInterface()、Type.Assemble、Type.GetProperties()、Type.GetMethod()、Type.GetField()、Type.GetCustomAttributes()等屬性
。1)、使用GetType()得到元數據的類(lèi)型對象(System.Type)
例:
類(lèi)一:
復制代碼 代碼如下:
class CustomClass
{
private string Name = "Test";
public string _Name = "Demo";
private int index { get; set; }
public int _index { get; set; }
private void GetName()
{
}
public void Get_Name()
{
}
}
類(lèi)二:同時(shí)使用了typeof與GetType()來(lái)得到類(lèi)型對象
復制代碼 代碼如下:
public void Exec()
{
CustomClass cc = new CustomClass();
//得到當前類(lèi)型的實(shí)例對象
Type type = cc.GetType();
//得到當前類(lèi)型的實(shí)例對象使用typeof
//Type type = typeof(CustomClass);
//遍歷public的屬性,而不是字段,使用GetProperties()
foreach (PropertyInfo property in type.GetProperties())
{
//得到屬性名
System.Console.WriteLine(property.Name);
//得到屬性的類(lèi)型
System.Console.WriteLine(property.PropertyType);
//得到反射的.類(lèi)型,就是反射對象的類(lèi)名
System.Console.WriteLine(property.ReflectedType);
//得到成員類(lèi)型,是屬性還是方法
System.Console.WriteLine(property.MemberType);
}
System.Console.WriteLine("------------------------------------------");
//得到當前對象的公共方法,包含公共屬性的方法get,set
foreach (System.Reflection.MethodInfo method in type.GetMethods())
{
//方法名
System.Console.WriteLine(method.Name);
//成員的類(lèi)型
System.Console.WriteLine(method.MemberType);
}
}
結果:
。2)、得到與設置屬性的值
復制代碼 代碼如下:
//設置屬性的值
property.SetValue(cc, 45, null);
//得到屬性的值
System.Console.WriteLine(property.GetValue(cc, null).ToString());
。3)、調用方法Invoke()函數
復制代碼 代碼如下:
MethodInfo demo = type.GetMethod("Get_Name");
demo.Invoke(cc, null);
得到一個(gè)無(wú)參的方法Get_Name,若有參null應為參數的數組
如: //調用有參的
復制代碼 代碼如下:
MethodInfo test = type.GetMethod("GetName");
string[] param = { "12" };
test.Invoke(cc, param);
特性 (attribute)
1、特性是用來(lái)描述或修飾元數據的額外的信息,比如說(shuō):類(lèi)、屬性、程序集等
2、自定義特性,繼承自Attribute類(lèi)
如下:
復制代碼 代碼如下:
class CustomAttribute : Attribute
{
public CustomAttribute();
public CustomAttribute(AttributeTargets validOn);
public bool AllowMultiple { get; set; }
public bool Inherited { get; set; }
public AttributeTargets ValidOn { get; }
}
使用:
復制代碼 代碼如下:
[CustomAttribute(AttributeTargets.All)]
class CustomClass
{
[CustomAttribute(AllowMultiple = true)]
[Custom(Inherited = true)]
private string Name = "Test";
public string _Name = "Demo";
private int index { get; set; }
public int _index { get; set; }
}
C、擴展方法的使用與Lambda表達式
擴展方法
當你不能修改一個(gè)類(lèi)的時(shí)候,擴展方法是一個(gè)方便給這個(gè)類(lèi)添加其它方法的方式
1、擴展方法的定義:擴展方法使用this這個(gè)關(guān)鍵字,將一個(gè)方法綁定到this所指向的類(lèi)型(如:類(lèi))的成員中對,從而就可以通過(guò)這個(gè)類(lèi)的對象來(lái)調用這個(gè)方法,在MVC中,擴展,HtmlHelper類(lèi)是很有用的,如下代碼:
復制代碼 代碼如下:
public static class PersonExtension
{
public static void Extension(this PersonSingle ps, string name)
{
System.Console.WriteLine("Name is " + name);
}
}
將Extension(string name)這方法添加到PersonSingle中去,然后就可以通過(guò)對象調用這個(gè)方法
PersonSingle類(lèi):
復制代碼 代碼如下:
public class PersonSingle
{
public void Show()
{
System.Console.WriteLine("PersonSingle Method!!!");
}
}
測試:
復制代碼 代碼如下:
private static void _Demo16()
{
PersonSingle ps = new PersonSingle();
ps.Show();
ps.Extension("whc");
}
2、擴展方法的訪(fǎng)問(wèn)權限要與所擴展的類(lèi)的方法一致,這里都是public
3、擴展方法是寫(xiě)在一個(gè)靜態(tài)類(lèi)中的靜態(tài)方法
Lambda表達式
Lambda表達式是一種比匿名方法更加簡(jiǎn)潔的一種匿名函數語(yǔ)法,其主要分為二類(lèi):一是語(yǔ)句lambda,二是表達式lambda
1、語(yǔ)句Lambda:是一種匿名方法的簡(jiǎn)化語(yǔ)法,其中不包含delegate關(guān)鍵字,只需要使用lambda運算符=>,是一個(gè)語(yǔ)句塊
例:
復制代碼 代碼如下:
Demo += (string first, string second) =>
{
System.Console.WriteLine();
};
2、表達式Lambda:是一個(gè)表達式,而不是一個(gè)語(yǔ)句塊
例:
復制代碼 代碼如下:
Demo = (first, second) => first.ToString();
3、Lambda表達式中能使用外部的變量
總結
那些年學(xué)習C#,作了一些筆記,此文大都直接從筆記中拷貝,當然還有很多沒(méi)有提到,將在下次追加一些;此文以回憶那些年學(xué)習的日子。
【C#學(xué)習筆記及方法】相關(guān)文章:
速錄學(xué)習技巧及方法08-13
速錄學(xué)習及提速方法08-13
速錄技巧及學(xué)習方法08-07
速錄學(xué)習方法及技巧11-11
CAD學(xué)習方法及技巧08-16
速錄的學(xué)習方法及技巧08-10
亞偉速錄學(xué)習方法及技巧11-13