学了一个星期的C#,对C#有了初步的了解。如所有初学者一样刚开始接触时可能会有点小陌生必须要多练,但比起C和C++,C#入门比较简单。下面针对这周所学内容进行简单的归纳,希望可以对初学者有一定的帮助。
C#高级部分:
(一),常用的对象
1,string是String类的别名
常用方法:*string Replace(old,new)用来替换字符串中的值。
old:要替换的字符,new:替换后的字符,返回值是替换过后的字符串。
*string Substring(int startIndex):从指定位置开始截取字符串,包含startIndex的字符。返回值就是截取后的字符串。
*string Substring(int startIndex,int count):从指定位置开始截取指定长度的字符串。
*int IndexOf(string):返回字符在字符串中第一次出现的位置。
*int LastIndexOf(string):返回字符在字符串中最后一次出现的位置。
*string[] Split(char[] sep):根据指定字符分割字符串。
*bool StartsWith(string):判断字符串是否是以指定字符开头的。
常用属性:
*Length:获得字符串中的字符数,返回值是int类型,只读属性 。
*Chars:获得指定为值得字符,是string对象的索引他,只读属性。str[1]不能写str.Chars[1]。
2,StringBuilder位于System.Text命名空间,StringBuilder无论追加多少个字符串,都是一个字符串。
Append()追加字符串。
ToStrig():把StringBuilder表示的值转换为String
3,DateTime 值类型Now:获得当前时间添加时间的方法
4,Random随机数next函数
(二),集合
1,装箱和拆箱:把值类型的数据赋值给应用类型叫装箱;把已经装相过得应用类型强制转换赋值给值类型叫拆箱
object o = 90;
int j = (int) o; 装箱和拆箱操作,影响了程序的执行效率,集合位于System.Collections命名空间。
2,哈希表:Hashtable实现了,ICollection和IEnumerable接口。
方法Add(object,object)通过索引来获得值。
3,链表集合:List<T>
4,ArrayList:集合位于System.Collections,是一个数组链表,具有数组的功能,也有链表的特色。
5,Dictionary<T, K>参看Hashtable的操作
(三),泛型
泛型指的的泛指的类型,话句话说就是类型可以是任意的,但一旦确定了某一种类型之后,那么类型确定,不能在换之。 List<T> :可以把T换成任何的类型,从而减少了装箱和拆箱的操作,定义一个泛型类。
下面是泛型的实例:
using System; public class StudyGeneric { public static void Main() { People<string,int> p = new People<string,int>("sss",56); People<int,string> p1 = new People<int,string>(78,"www"); } } public class People<Q,T> { public T Age { get;set; } private Q name; public Q Name { get{return name;} set{name = value;} } public People(){} public People(Q q,T t) { this.name = q; this.Age = t; } }
注意:泛型类的构造函数不能还有<>
(四),委托
监视者模式:发布委托----被监视者
接受委托----监视者
下面是几种委托的代码很有助于我对委托的理解:
using System; //这个委托的名字是MyDel,委托的类型是MyDel //这个委托代表了一系列函数,这一些函数特点必须是没有返回值,没有参数。 public delegate void MyDel(); //这个委托代表了一系列函数,这一系列函数特点必须是返回值为String,并且有一个String类型的参数。 public delegate void MyDel2(string name); //这个委托代表了一系列函数,这一系列函数特点必须是返回值为String,并且有一个String类型的参数。 public delegate int MyDel3(int a,int b); public class StudyDelegate { public static void Main() { int a = 0; //1.如果使用new关键字来创建委托对象,则必须使用一个函数初始化这个委托对象。 MyDel2 my = new MyDel2(print); //2.如果不适用new关键字来创建委托对象,则可以直接赋值。 MyDel2 m1 = print2; //3,委托和他封装的方法就有相同的功能。 //my("ss"); //m1("ww"); //4,既然委托代表了一系列函数,那么一个委托对象可以承接多个函数。 my += print2; my("ss"); my -= print2; my("ss"); } public static void print(string name) { Console.WriteLine("print----------"+name); } public static void print2(string n) { Console.WriteLine("2222----------"+n); }
(五),lambda表达式
lambda表达式其实就是匿名委托的一个精简版。 下面是对各种是否有返回值和型参作出以下总结:
1,public delegate void Del1();
Del1 d1 = delegate(){Console.WriteLine("ss");};
d1 = ()=>{Console.WriteLine("ss");}; 由于没有参数,那么()不能省略
2,public delegate int Del2();
Del2 d2 = delegate(){return 1;};
d2 = ()=>{return 1;};
如果是直接返回,换句话说就是没有业务逻辑处理,也就是只有一条返回语句,可以把{}换成()同时去掉return关键字
d2=()=>(1);
如果方法体中有业务逻辑,则必须使用{}
d2=()=>{if(2>1){return 1;}else{return 2;}};
2,public delegate void Del3(string a);
Del3 d3 = delegate(string a){Console.WriteLine(a);};
d3 = (stirng a)=>{Console.WriteLine(a);};
可以把参数的类型给去掉,因为系统会自行的判断参数的类型,毕竟是把这个lambda赋值给了对应的委托。
d3 = (a)=>{Console.WriteLine(a);};
如果说只有一个参数,则不需要()
d3 = a =>{Console.WriteLine(a);};
4,public delegate string Del4(string a);
Del4 d4 = delegate(string a){string c = a+78;return c;}
d4 = (string a)=>{a+78;return a;};
d4 = a=>{a+78;return a;}
d4 = a=>("gg");
5,public delegate int Del5(int a,int b);
Del5 d5 = delegate(int a,int b){return a+b;}'
d5 = (int a,int b)=>{return a+b;};
d5 = (a,b)=>{return a+b;};
如果参数个数是大于1的时候,不能把小括号给去掉
d5 = (a,b)=>(a+b);
d5 = (a,b)=>a+b;
d5 = a=>a+1;