C#学习入门

来源:互联网 发布:国家中级程序员证书 编辑:程序博客网 时间:2024/06/12 06:25

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关键字。
看到这里,在结合上面的讲解:声明一个事件不过类似于声明一个进行封装的委托类型的变量而已。

加深理解 、如何使用

转载一下高手

http://blog.csdn.net/cheungbill/article/details/7687894

事件是特殊的委托 对委托进行了封装 事件是特殊的委托
事件规定只允许用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的函数*

迭代器的使用

IEnumerable和IEnumerator 详解
Foreach 实现机制

0 0
原创粉丝点击