DateTime:
转自
http://www.cnblogs.com/artech/archive/2010/09/04/1817833.html
String.Fromat();
String.Format(String,Object);String.Format(String,Object[])将格式项替换为指定Object的实例项
String.Format(String,Object,Object)
String.Format(String,Object,Object,Obect); 把String中的格式项替换成多个Object实例
1 字符串类型的数字
string str1=string.Format(“{0:N1}”,56789);// 56,789.0
string str2=string.Format(“{0:N2}”,56789);//56,789.00
string str3=string.Format(“{0:F1}”,56789);//56789.0
string str4=string.Format(“{0:F2}”,56789);//56789.00
string str5=(56789/100.0).ToString(“#.##”);//567.89
string str6=(56789/100).ToString(“#.##”);//567
2 格式化货币
string.Format(“{0:C}”,0.2);//¥0.20 默认保留两位 C1 保留一位 C2 保留两位
格式化多个Object实例
string.Format(“(市场价::{0:C})”,“优惠价{1:C}”,23.15,19.80);{}内0表示第一个 1 表示第二个Object
3 格式化 十进制 D
string.Format(“{0:D3}”,23);//结果为:023 D2,123333结果为123333(精度说明符指示二结果字符窜中所需的最少数字个数)
4、用分号隔开的数字,并指定小数点后的位数
string.Format(“{0:N}”, 14200) //结果为:14,200.00 (默认为小数点后面两位)
string.Format(“{0:N3}”, 14200.2458) //结果为:14,200.246 (自动四舍五入)
5、格式化百分比
string.Format(“{0:P}”, 0.24583) //结果为:24.58% (默认保留百分的两位小数)
string.Format(“{0:P1}”, 0.24583) //结果为:24.6% (自动四舍五入)
6、零占位符和数字占位符
string.Format(“{0:0000.00}”, 12394.039) //结果为:12394.04
string.Format(“{0:0000.00}”, 194.039) //结果为:0194.04
string.Format(“{0:###.##}”, 12394.039) //结果为:12394.04
string.Format(“{0:####.#}”, 194.039) //结果为:194
7 日期格式化
string.Format(“{0:d}”,System.DateTime.Now) //结果为:2009-3-20 (月份位置不是03)
string.Format(“{0:D}”,System.DateTime.Now) //结果为:2009年3月20日
string.Format(“{0:f}”,System.DateTime.Now) //结果为:2009年3月20日 15:37
string.Format(“{0:F}”,System.DateTime.Now) //结果为:2009年3月20日 15:37:52
string.Format(“{0:g}”,System.DateTime.Now) //结果为:2009-3-20 15:38
string.Format(“{0:G}”,System.DateTime.Now) //结果为:2009-3-20 15:39:27
string.Format(“{0:m}”,System.DateTime.Now) //结果为:3月20日
string.Format(“{0:t}”,System.DateTime.Now) //结果为:15:41
string.Format(“{0:T}”,System.DateTime.Now) //结果为:15:41:50
委托事件
委托: ( delegate) 委托也是一个类 但与类的生明方式有点不同,在编译的时候编译成类。因为delegate是一个 类,所以类存在的地方它都可以存在
常规用法
public delegate void MeetDelegate(string name);
private static void EnglishGreeting(string name){Console.WriteLine("Morning"+name)}
private static void ChineseGreeting(string name){Console.WriteLine("早上好,"+name);}
private static void MeetPeople(string name,MeetDelegate delegate2){delegate2(name);}
MeetDelegate MD;
MD=EnglishGreeting;
MD+=ChineseGreeting;
MD-=ChineseGreeting;
此处可以看出委托的用法其实和C++的函数指针如出一辙(不都说 C#就是C++和Java的产物嘛)
事件
思考上面的程序 在同一个类中没有什么实际意义 貌似 ,在实际应用中我们通常把delegate和 chineseGreaeting EnglishGreeting 放在两个不同的类中
public delegate void GreetingDelegate (string name);
private static void EnglishGreeting(string name){Console.WriteLine("Morning"+name)}
private static void ChineseGreeting(string name){Console.WriteLine("早上好,"+name);}
public class GreetingManager{
public GreetingDelegate delegate1;
public void GreetPeople(string name,GreetingDelegate delegate2){
delegate2(name);}
}
static void Main(string[] args){
GreetingManager gm=new GreetingManager();
gm.delegate1=EnglishGreeting;
gm.delegate1+=ChineseGreeting;
gm.GreetPeople("Jimmy Zhang",gm.delegate1);}
输出为: Morning ,Jimmy Zhang
早上好,Jimmy Zhang
这里把外部的函数付给委托 然后通过函数外部传递把内存中的委托数据传递到GreetPeople中声明的委托的
由于我们在传递的时候两次使用了delegate1字段 可以修改GreetingManager为:
public class GreetingManager{
public GreetingDelegate delegate1;
public void GreetPeople(string name){
if(delegate1!=null){
delegate1(name);
}
}
}
所以我们调用的时候可以:
gm.delegate1=EnglistGreeting;
gm.delegate1+=ChineseGreeting;
gm.GreetPeople("Jimmy Zhang");
输入:相同
第一个用 = 赋值,是对其进行实例化,第二个方法注册则用 += 。但是不管赋值还是注册,都是将
方法绑定到委托上,除了调用时先后顺序不同,再没任何的区别
所以这里就有事件的雏形了:类和外部分离
解析: 就相当于函数指针 把函数放到指针中 这里放到委托中 然后在类的内部调用该委托指向函数
上方 :函数——>委托1——>委托2——>执行委托2中的函数
下方: 函数——>委托1——>执行委托中的函数
于是我们使用Event,他封装了委托类型的变量,使得在类的内部,不管你声明他是public还是protected
他总是private的,在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明时间时使用的访问符相同
我们改写GreetingManager类,它变成这个样子:
public class GreetingManager{
public event GreetingDelegate MakeGreet;
public void GreetPeople(string name){
MakeGreet(name);
}
}
GreetingManager greetingManager;
greetingManager.MakeGreet+=EnglishMeeting();
greetingManager.MakeGreet+=ChineseMeeting();
greetingManeger.GreetPeople("xixixixixixixi");
很容易注意到:MakeGreet事件的声明与之前委托delegate1的声明唯一的区别是多了一个Event关键字。
看到这里,在结合上面的讲解:声明一个事件不过类似于声明一个进行封装的委托类型的变量而已。
加深理解 、如何使用
转载一下高手
事件是特殊的委托 对委托进行了封装 事件是特殊的委托
事件规定只允许用add, remove方法来操作 所以不支持=操作
事件内部 private delegate 。。。所以只能在类的内部调用
委托 故名思意 就是请别人帮忙 监控一下
*两个类 类2监控类1了 如果在类1中做了什么事 要触发在类2的事件(一个处理函数),传统方法 要在类1的处理函数中触发 类2的处理函数 那类2就得在类1之前实例化 这样就两者就相关联了 与面向对象的概念不符,
传统 class A{ A的函数(B的函数)} class B{B的函数()} B要在A之前实例化 A的对象才可以触发B的函数
使用事件 class A{ A的函数(B的函数)} class B{B的函数()} 事件+=B;只要A一触发事件就调用B的函数*