那些年,我還在學習C# 學習筆記

來源:互聯網
上載者:User

C#是一門物件導向的語言,具有物件導向的基本特徵,抽象、封裝、繼承、多態等性質。學習C#除了一些基本的文法,還得學習一些新的特性,比如說:泛型、多線程、集合、反射等,下面就選其中一些來學習吧!
一、C#中的各種器
A、 C#構造器-建構函式
如下: 複製代碼 代碼如下://構造器1
public Products(int id)
{
_Id = id;
}
//構造器2,使用this來調用構造器1
public Products(int id, string Name, string Band)
: this(id)
{
_ProductName = Name;
_ProductBand = Band;
}

靜態構造器-用來對類進行初始化資訊,它不是顯示調用的,在首次訪問類時將自動調用,用來初始化類的一些基本資料而不是對象,但最好不要使用靜態構造器,代碼如下: 複製代碼 代碼如下:static Products() { }//靜態構造器
public Products() { }

B、初化器-在沒有帶參數的構造器時,我們可以用初始化器對對象的共公屬性進行初始化
如下: 複製代碼 代碼如下://產品的集合List
List<Products> ListProduct = new List<Products>()
{
new Products() { _Id = 1, _ProductName = "whc" },//使用{}是調有用初始化器,對屬性進行初始化
new Products() { _Id = 1, _ProductName = "whc1", _ProductBand = "ctbu" },
new Products() { _Id = 1, _ProductName = "whc2", _ProductBand = "ctbu" }
};

C、終結器
終結器是在一次對象最後一次活動之後,並在程式終止之前執行。拉圾回收器會在回收過程中,找到帶有終結器的對象,然後加入到終結隊列,線程遍曆完了,就調用終結隊列上對象的終結器來回收資源
二、C#中那些重要的知識
A、委託與事件
委託
C#中將一個方法作為一個參數傳遞給其它方法使用,實現這樣功能的模式叫做委託
1、委託的類型:是強型別,因為在聲明委託方法時,指定的參數,在調用這個委託時必須傳遞相同類型的參數與參數個數
2、委託的內部機制:C#中所有的委託都繼承自System.Delegate,但是我們不能繼承它來實現自訂的委託,可以使用delegate關鍵字來定義
3、委託的定義:使用delegate關鍵字來使用
4、委託的執行個體化:定義一個與委託相同類型的函數,作為委託的參數傳遞,不需要用new關鍵字進行執行個體化,它可以通過委託推斷,在C#1.0中,在傳遞方法時,需要用new delegate(Method)
5、委託的使用: 複製代碼 代碼如下:class DelegateClass
{
//一個泛型的委託,可以不同類型的參數進行處理
public delegate void AlculateMethod<T>(T first, T second);
}
class MehtodConllection
{
public void AlculateAdd<T>(T first, T second)
{
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<T>(T first, T second)
{
string third = first.ToString() + "Hello Word" + second.ToString();
System.Console.WriteLine(third);
}
}
private static void _Demo4()
{
//方法的集合
MehtodConllection mc = new MehtodConllection();
//泛型的委託聲明
DelegateClass.AlculateMethod<string> Demo = null;
//添加委託方法
Demo += mc.AlculateAdd<string>;
//
Demo += mc.AlculateAddOther<string>;
//調用方法,所有在委託中的方法都能被執行
Demo("str", "sterte");
}

事件
事件是一種特殊的委託,在聲明委託時,添加一個event關鍵字
步驟:
1、定義委託的類型,相當於一個類,如: public delegate void ActionMethod();
2、定義事件委託變數,用1、中的委託類型定義,如: public event ActionMethod amd;
3、調用定義的事件,觸發器,如: 複製代碼 代碼如下:class Cat
{
//定義委託方法
public delegate void ActionMethod();
//聲明事件委託
public event ActionMethod amd;
//觸發事件
public void CatShout()
{
System.Console.WriteLine("貓叫了,事件觸發了!!!");
amd();
}
}

4、向事件中添加方法,將方法與事件綁定在一起,以便在觸發時一起執行,如: 複製代碼 代碼如下: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、最後觸發事件
B、反射與特性
反射
1、反射的作用:
(1)、訪問程式集中的中繼資料,比如說,方法屬性修鉓符
(2)、使用中繼資料,在運行時動態調用中繼資料的成員與屬性等,而不是在編譯時間進行綁定
2、反射是擇指對一個程式集中的中繼資料進行檢查的過程,並且可以列舉程式集的類型與屬性,以及使用一些特定的對象調用上面的成員
3、使用System.Type訪問中繼資料
類型的中繼資料System.Type是一個執行個體,這個執行個體提供了一些方法,這些方法可以列舉中繼資料的成員,主要方法有以下幾種:
Type.Name、Type.IsPublic、Type.BaseType、Type.GetInterface()、Type.Assemble、Type.GetProperties()、Type.GetMethod()、Type.GetField()、Type.GetCustomAttributes()等屬性
(1)、使用GetType()得到中繼資料的類型對象(System.Type)
例:
類一: 複製代碼 代碼如下: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()
{
}
}

類二:同時使用了typeof與GetType()來得到類型對象 複製代碼 代碼如下:public void Exec()
{
CustomClass cc = new CustomClass();
//得到當前類型的執行個體對象
Type type = cc.GetType();
//得到當前類型的執行個體對象使用typeof
//Type type = typeof(CustomClass);
//遍曆public的屬性,而不是欄位,使用GetProperties()
foreach (PropertyInfo property in type.GetProperties())
{
//得到屬性名稱
System.Console.WriteLine(property.Name);
//得到屬性的類型
System.Console.WriteLine(property.PropertyType);
//得到反射的類型,就是反射對象的類名
System.Console.WriteLine(property.ReflectedType);
//得到成員類型,是屬性還是方法
System.Console.WriteLine(property.MemberType);
}
System.Console.WriteLine("------------------------------------------");
//得到當前對象的公用方法,包含公用屬性的方法get,set
foreach (System.Reflection.MethodInfo method in type.GetMethods())
{
//方法名
System.Console.WriteLine(method.Name);
//成員的類型
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);

得到一個無參的方法Get_Name,若有參null應為參數的數組
如: //調用有參的 複製代碼 代碼如下:MethodInfo test = type.GetMethod("GetName");
string[] param = { "12" };
test.Invoke(cc, param);

特性 (attribute)
1、特性是用來描述或修飾中繼資料的額外的資訊,比如說:類、屬性、程式集等
2、自訂特性,繼承自Attribute類
如下: 複製代碼 代碼如下: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運算式
擴充方法
當你不能修改一個類的時候,擴充方法是一個方便給這個類添加其它方法的方式
1、擴充方法的定義:擴充方法使用this這個關鍵字,將一個方法綁定到this所指向的類型(如:類)的成員中對,從而就可以通過這個類的對象來調用這個方法,在MVC中,擴充,HtmlHelper類是很有用的,如下代碼: 複製代碼 代碼如下:public static class PersonExtension
{
public static void Extension(this PersonSingle ps, string name)
{
System.Console.WriteLine("Name is " + name);
}
}

將Extension(string name)這方法添加到PersonSingle中去,然後就可以通過對象調用這個方法
PersonSingle類: 複製代碼 代碼如下: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、擴充方法的存取權限要與所擴充的類的方法一致,這裡都是public
3、擴充方法是寫在一個靜態類中的靜態方法
Lambda運算式
Lambda運算式是一種比匿名方法更加簡潔的一種匿名函數文法,其主要分為二類:一是語句lambda,二是運算式lambda
1、語句Lambda:是一種匿名方法的簡化文法,其中不包含delegate關鍵字,只需要使用lambda運算子=>,是一個語句塊
例: 複製代碼 代碼如下:Demo += (string first, string second) =>
{
System.Console.WriteLine();
};

2、運算式Lambda:是一個運算式,而不是一個語句塊
例: 複製代碼 代碼如下:Demo = (first, second) => first.ToString();

3、Lambda運算式中能使用外部的變數
總結
那些年學習C#,作了一些筆記,此文大都直接從筆記中拷貝,當然還有很多沒有提到,將在下次追加一些;此文以回憶那些年學習的日子。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.