c# 的委托就是說把函數(shù)當參數(shù)來傳遞。
這個在js完全就用不著搞什么委托東西,直接轉就是了嘛。對不對!怎么錄嘛!
一個函數(shù),如果它的參數(shù)是函數(shù),那么是這樣子寫的
public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod)
Action<string, Int32> voidMethod
的意思是說這個將被傳進來的函數(shù)是一個沒有return的函數(shù),就是public void啦, 它需要一個str參數(shù)
(這里提一下,js中每個函數(shù)都是return的即使你沒有寫,它也會return undefiend)
Func<string, Int32> returnMethod
的意思是說這個函數(shù)是一個有return的函數(shù),最后一個參數(shù)Int32代表了它的return是一個Int32 , 就是 public Int32啦, 那么除了最后一個參數(shù)其余的都是這個函數(shù)所需要的參數(shù)了
具體代碼 :
public void test(Func<string,int,string> returnMethod, Action<string> voidMethod){ voidMethod("para1"); string returnValue = returnMethod("para1", 5);}PRotected void Page_Load(object sender, EventArgs e){ //第一種寫法 test(delegate(string para1, int para2) { return ""; }, delegate(string para1) { string x = "do somthing"; }); //第2中寫法,有點表達式的味道了。 js的話要ECMA6才支持箭頭寫法 test((para1, para2) => "5", (para1) => { string x = "do somthing"; }); test((para1, para2) => { string a = "5" + para1; return a + "5"; }, (para1) => { string x = "do somthing" + para1; });}
這里使用的是匿名函數(shù)delegate(){},這個比較習慣,因為js大多數(shù)會用匿名函數(shù)的。
當然,如果你硬硬要old school風 , 可以寫比較傳統(tǒng)的
public void method(tuoguan voidMethod, tuoguan2 returnMethod) //這里不可以在寫 Action or Func了 { Int32 i = returnMethod("b"); voidMethod("b"); } public delegate void tuoguan(string name); public delegate Int32 tuoguan2(string name); public Int32 returnMethod(string name) { return 5; } tuoguan xx = delegate(string name) { //do somthing }; tuoguan2 yy = returnMethod; //這里可以指向某個方法,不是一定要寫 delegate method(xx, yy);
委托是很好用的,比如我對進去的匿名函數(shù)也可以引用到作用域上的變量,這個和js是一樣的!
把它當js來寫,我覺得這樣非常好!
繼承
//簡單介紹public class basic_class_logic{ public abstract class chouxiang //抽象類只是一個虛擬的類,是不可以實例化的(其它特性和普通類一樣),目的是給派生類(子類)使用 { //與接口不同 //里面可以寫屬性方法 } //public:它具有最高的訪問級別,對訪問公共成員沒有限制。 //private:它的訪問級別最低,僅限于它的包含類。 //protected:能在它的包含類或包含類的派生類中訪問。 //internal:只能在同一程序集的文件中。 //protected internal:僅限于從包含類派生的當前程序集或類型。 //public abstract:可以在任何地方訪問,但不能實例化,只能繼承。 //public sealed:可以在任何地方訪問,只能實例化,不能派生。 public static void move() { } //static void 是靜態(tài)方法 (無需實例化類也可以調(diào)用) public const int months = 12; //const 是常量 ,一旦賦值就不能改變,通常用于一些死的變量 // public const DateTime months = new DateTime(2013, 10, 07, 00, 05, 00, 00); 這里會報錯 ! const 不能使用 new ,所以用readonly就不會 public readonly int MAX_VALUE = 10; // readonly 也是常量 。動態(tài)常量 , 有人建議用這個不要用 const //公有name "引用" 私有name (和js 一樣邏輯) //調(diào)用: //Car first = new Car(); //first.name = "keatkeat"; //first.changeName("xinyao"); //string a = first.name; //result : xinyao //* public class Person { private string _name; //私有name public Person() { this.name = "ttc"; } public string name //公有name { get { return _name; } //返回私有name set { _name = value; } // set 私有name } public void changeName(string name)//公有方法 { _name = name; //替換私有name } } //無需私有name 的方式 效果和上面一個差不多 public class Car { public string name { get; set; } //公有name public void changeName(string name) { this.name = name; //change obj.name } } }//繼承public class xuncheng { public class Person //基類,父類 { public Person(string name, int age = 0) //實例化是調(diào)用的函數(shù) { this.name = name; this.age = age; } public string name { get; set; } public int age { get; set; } public string getName() //普通方法 { return this.name; } public abstract string getAbstractName(); //abstract 抽象方法(只有在抽象類才能有抽象方法) ,在本類是無法調(diào)用的,也無內(nèi)容,只是一個聲明,子類通過覆蓋方法來調(diào)用(一定要有覆蓋的方法,不然會error) public virtual void sayVirtualName() //virtual 虛方法,本類可以調(diào)用,子類可以覆蓋,如果沒有覆蓋將調(diào)用此方法 (和普通方法幾乎一樣) { string a = "bb"; } } //講解: //子類可以調(diào)用所有父類的屬性和方法(除了私有的不可以) public class Student : Person { //base.屬性 ,base.方法 通過base關鍵字,調(diào)用父類的函數(shù) (孩子的孩子,通過base方法就會一直向上調(diào)用,不管幾代都能一直往上) public string school_name { get; set; } public Student(string school_name) //調(diào)用基類的構造函數(shù)(實例化時的函數(shù)) 可以寫default也可以是傳入?yún)?shù) : base(school_name, 5) { this.school_name = school_name; } public new string getName() //可以用 new 來隱藏父類的普通方法,在父類依然是調(diào)用父類,在子類就會調(diào)用new 的方法子類。 { string a = this.name; //如果子類沒有name 屬性會調(diào)用父類的,有的話會調(diào)用子類的 string b = base.name; //100%調(diào)用父類的name return "覆蓋name"; } public override string getAbstractName()//通過 override 來覆蓋抽象方法或虛方法,一但覆蓋了即便是在父類也將調(diào)用覆蓋了的新方法了! { return "抽象方法必須實現(xiàn)-用override"; } public override void sayVirtualName()//通過 override 來覆蓋虛方法 (如果子類沒有覆蓋將調(diào)用回復類方法) { string start = "xx"; //這樣就可以達到擴展方法的效果了 base.sayVirtualName();//調(diào)用回原本的方法 string end = "xx"; } } }//泛型//調(diào)用時才把類型傳進去,有點動態(tài)的感覺//調(diào)用 : Parent<string> xx = new Parent<string>(); 這個時候才指定是string public class Parent<T> //T 是一個類型 比如 string,int { public T name { get; set; } public T getName() { return this.name; }}//struct 是 值類型 //好處調(diào)用的是如果參數(shù)是值類型可以不用著名 test(100) 而不需要 test<int>(100);public void test<T>(T number) where T : struct{ int z = Convert.ToInt32(number); //調(diào)用 test(100);}//不知道好處在哪public void test2<T>(T lei) where T : class{}//我知道哪個class還需要用泛型嗎?! 不解public void test3<T>() where T : stooges{}//進來實例化就走?也是不知道哪里用得上!實例了又不能調(diào)用它的方法啦!靠public T test4<T>() where T : new(){ T abc = new T(); return abc;}public class stooges{ }protected void Page_Load(object sender, EventArgs e){}
新聞熱點
疑難解答