委托 delegate, 继承
c# 的委托就是说把函数当参数来传递。
这个在js完全就用不着搞什么委托东西,直接转就是了嘛。对不对!怎么录嘛!
一个函数,如果它的参数是函数,那么是这样子写的
public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod)
Action<string, Int32> voidMethod
的意思是说这个将被传进来的函数是一个没有return的函数,就是public void啦, 它需要一个str参数
(这里提一下,js中每个函数都是return的即使你没有写,它也会return undefiend)
Func<string, Int32> returnMethod
的意思是说这个函数是一个有return的函数,最后一个参数Int32代表了它的return是一个Int32 , 就是 public Int32啦, 那么除了最后一个参数其余的都是这个函数所需要的参数了
具体代码 :
public void test(Func<string,int,string> returnMethod, Action<string> voidMethod)
{
voidMethod("para1");
string returnValue = returnMethod("para1", );
}
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) => "", (para1) => { string x = "do somthing"; });
test((para1, para2) =>
{
string a = "" + para1;
return a + "";
}, (para1) =>
{
string x = "do somthing" + para1;
});
}
这里使用的是匿名函数delegate(){},这个比较习惯,因为js大多数会用匿名函数的。
当然,如果你硬硬要old school风 , 可以写比较传统的
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 ;
} tuoguan xx = delegate(string name)
{
//do somthing
};
tuoguan2 yy = returnMethod; //这里可以指向某个方法,不是一定要写 delegate
method(xx, yy);
委托是很好用的,比如我对进去的匿名函数也可以引用到作用域上的变量,这个和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 是静态方法 (无需实例化类也可以调用)
public const int months = ; //const 是常量 ,一旦赋值就不能改变,通常用于一些死的变量
// public const DateTime months = new DateTime(2013, 10, 07, 00, 05, 00, 00); 这里会报错 ! const 不能使用 new ,所以用readonly就不会
public readonly int MAX_VALUE = ; // readonly 也是常量 。动态常量 , 有人建议用这个不要用 const //公有name "引用" 私有name (和js 一样逻辑)
//调用:
//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 = ) //实例化是调用的函数
{
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 抽象方法(只有在抽象类才能有抽象方法) ,在本类是无法调用的,也无内容,只是一个声明,子类通过覆盖方法来调用(一定要有覆盖的方法,不然会error)
public virtual void sayVirtualName() //virtual 虚方法,本类可以调用,子类可以覆盖,如果没有覆盖将调用此方法 (和普通方法几乎一样)
{
string a = "bb";
}
}
//讲解:
//子类可以调用所有父类的属性和方法(除了私有的不可以)
public class Student : Person
{
//base.属性 ,base.方法 通过base关键字,调用父类的函数 (孩子的孩子,通过base方法就会一直向上调用,不管几代都能一直往上)
public string school_name { get; set; }
public Student(string school_name) //调用基类的构造函数(实例化时的函数) 可以写default也可以是传入参数
: base(school_name, )
{
this.school_name = school_name;
} public new string getName() //可以用 new 来隐藏父类的普通方法,在父类依然是调用父类,在子类就会调用new 的方法子类。
{
string a = this.name; //如果子类没有name 属性会调用父类的,有的话会调用子类的
string b = base.name; //100%调用父类的name
return "覆盖name";
}
public override string getAbstractName()//通过 override 来覆盖抽象方法或虚方法,一但覆盖了即便是在父类也将调用覆盖了的新方法了!
{
return "抽象方法必须实现-用override";
}
public override void sayVirtualName()//通过 override 来覆盖虚方法 (如果子类没有覆盖将调用回复类方法)
{
string start = "xx"; //这样就可以达到扩展方法的效果了
base.sayVirtualName();//调用回原本的方法
string end = "xx";
}
}
} //泛型
//调用时才把类型传进去,有点动态的感觉
//调用 : 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 是 值类型
//好处调用的是如果参数是值类型可以不用著名 test(100) 而不需要 test<int>(100);
public void test<T>(T number) where T : struct
{
int z = Convert.ToInt32(number);
//调用 test(100);
}
//不知道好处在哪
public void test2<T>(T lei) where T : class
{ }
//我知道哪个class还需要用泛型吗?! 不解
public void test3<T>() where T : stooges
{ }
//进来实例化就走?也是不知道哪里用得上!实例了又不能调用它的方法啦!靠
public T test4<T>() where T : new()
{
T abc = new T();
return abc;
}
public class stooges
{ } protected void Page_Load(object sender, EventArgs e)
{ }
更新 2016-07-12
async 一个方法
Func<Task<string>> xx = async () =>
{
await Task.Delay();
return "";
};
string www = await xx();
委托 delegate, 继承的更多相关文章
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- C# 委托Delegate(一) 基础介绍&用法
本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- C# 代理/委托 Delegate
本文转载自努力,努力,努力 1. 委托的定义:委托是函数的封装,它代表一"类"函数.他们都符合一定的签名:拥有相同的参数列表,返回值类型.同时,委托也可以看成是对函数的抽象,是函数 ...
- c# 委托 delegate
委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...
- 理解委托(delegate)及为什么要使用委托
理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来 ...
- 深入理解委托(Delegate)
前言 委托其实一直以来都感觉自己应该挺熟悉的,直到最近又去翻了翻 CLR via C#,感觉我之前的理解可能还有失偏颇.在这记录一下. 之前文章的链接: 接口和委托的泛型可变性 C#高级编程笔记 De ...
- C# -- 使用委托 delegate 执行异步操作
C# -- 使用委托 delegate 执行异步操作 委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似. 与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的. 委托的 ...
随机推荐
- 数组在C++和java中的区别
几乎所有的程序设计语言都支持数组.在C和C++中使用数组是很危险的.因为C和C++中的数组就是内存块.如果一个程序要访问其自身内存块之外的数组,或者在数组初始化之前使用它,都会产生难以预料的后果. j ...
- [置顶] 【Git入门之九】解决冲突
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309531 1.多人协作冲突 如果多人同时修改了同一个文件,那会出现什么样 ...
- ehcache报错ERROR n.s.e.store.disk.DiskStorageFactory - Disk Write的解决办法
23:53:44 ERROR n.s.e.store.disk.DiskStorageFactory - Disk Write of com.koal.**.**.**.**.**.***Impl$$ ...
- 在Android项目中启用Java 8的部分特性--Lambda & Method References
Android N发布时同时发布了一个新的编译工具Jack(AS2.1+支持),基于Jack我们可以使用Java 8 的部分特性,在低版本机器上能使用的更少,同时Jack也有诸多不完善,工具链的改变难 ...
- CloudFoundry Service 使用
Mysql服务在V2版本号中github上有独立的releaseproject(cf-mysql-release),该release提供了一个Mysql-broker和一个Mysql-server和( ...
- 使用jcrop进行头像剪切
http://www.cnblogs.com/chenssy/archive/2013/05/18/3084985.html http://code.ciaoca.com/jquery/jcrop/ ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- 跟我一起学PCL打印语言(一)
引言 本人从事打印机开发和打印驱动开发的相关工作,深感资料特别是中文资料的匮乏和不成系统,对新入门的从事该行业的人来说,门槛很高.在这里一方面是将开发中遇到的相关知识点整理出来,另一方面也能够促进自己 ...
- MySQL(13):Select-order by
1. 按照字段值进行排序: 语法: order by 字段 升序|降序(asc|desc) 允许多字段排序,指的是,先按照第一个字段排序,如果说,不能区分,才使用第二个字段,以此类推. ...
- Windows Server 2008 R2 搭建FTP服务
一.安装ftp服务 1.在服务管理器"角色"右键单击"添加角色". 2.下一步. 3.勾选"Web 服务器(IIS)",下一步. 4.勾选 ...