前段时间学C#的上转型,泛型,lambda表达式这些应用的理解很费劲。学过之后我多多的练习了几天,接下来继续复习C#的其他一些概念,说实在的这些知识点学过之后很容易忘,但是都是很重要的,所以发表在博客上没事可以多看看复习一下。
第一:扩展方法-----在不更改原来类的基础上,为类添加的方法。扩展方法的行为和静态方法非常的类似,你只能在静态类中声明它们。为声明一个扩展方法,你需要给该方法的第一个参数指定this关键字,而且你的第一个参数必定是你所扩展的类型实例。简单点说就是给现在已经存在的类,在不修改该类源代码的情况修改,向该类中添加某些方法实现特定的功能。其实本人不会喜欢扩展方法,我觉得直接定义一个普通函数就可以实现的。或许我现在接触的实例还少吧。
需要注意的是: 1,扩展方法必须写静态类中
2,扩展方法必须是静态方法,虽然是静态方法,但是这个扩张方法是为对象扩展的,只能由对象调用。
他的写法如下: public static class 类名
{ public static 返回值 方法名(this 要扩展的类型 对象名[,参数列表])
{ }
}
这里的 this 要扩展的类型 对象名[,参数列表] 这个参数只起到一个说明性作用。
下面是一个扩展方法的实例:
using System; using System.Collections.Generic; using System.Linq; public class StudyExtendMethod { public static void Main() { string file = @"E:\FTPPUBLISH\学习资料\KindEditor\kindeditor-v4.0.3\examples\colorpicker.html"; Console.WriteLine(file.GetFileType()); string sss = "78.9.09.mp3"; Console.WriteLine(sss.GetFileType()); People pp = new People(); pp.WatchTime("www"); string od = pp.GetInfo("张三"); Console.WriteLine(od); List<int> list = new List<int>(); list.Add(1); list.Add(19); list.Add(34); list.Add(56); list.Add(2); list.Add(90); list.Add(23); list.Add(27); var c = list.GetBigTen(10); foreach(int d in c) { Console.WriteLine(d); } } } public static class ExtendMethod { /* this string ss 这个参数只起到一个说明性作用。 这个扩展方法是为string的对象扩展的,只能有string得对象来使用 str值得是使用这个扩展方的对象。 */ public static string GetFileType(this string str) { string[] strs = str.Split('.'); return strs[strs.Length-1]; } public static void WatchTime(this People p,string name) { Console.WriteLine(name +" "+DateTime.Now); } public static string GetInfo(this People p,string name) { return name+"sssss"; } public static IEnumerable<int> GetBigTen(this List<int> list,int a) { return list.Where(p=>p>a); } } public class People { }
第二:Linq----Linq是语言集成化查询
基础语法有: from 元素 in 集合;where 元素条件;orderby 元素.属性 ascending; group 元素 by 元素.属性;select 元素 注意:如果使用group by语句,则不需要select。
下面是Linq的一个简单的实例:
View Code using System; using System.Collections.Generic; using System.Linq; public class StudyLinq3 { public static void Main() { List<Student> list = new List<Student>(); list.Add(new Student(){Age=10,Name="Jack",Address="bj"}); list.Add(new Student(){Age=67,Name="Mack",Address="郑州"}); list.Add(new Student(){Age=23,Name="Dack",Address="USA"}); list.Add(new Student(){Age=56,Name="Cack",Address="bj"}); list.Add(new Student(){Age=8,Name="Eack",Address="郑州"}); list.Add(new Student(){Age=34,Name="Hack",Address="bj"}); list.Add(new Student(){Age=18,Name="小红",Address="USA"}); var result = ( from p in list where p.Age >30 select p).OrderByDescending(pp=>pp.Age); foreach(Student s in result) { Console.WriteLine(s.Age); } /* string[] str = {"a","bb","abc","中华民谣","USA"}; IEnumerable<string> result = from p in str where p.Length>3 select p; foreach(string s in result) { Console.WriteLine(s); } IEnumerable<string> result = str.Where<string>(p=>p.Length>3); foreach(string s in result) { Console.WriteLine(s); }*/ } } public class Student { public int Age { get; set; } public string Name { get;set; } public string Address {get;set;} }
第三:IO using---I/O的意思是input/output输入和输出他的参照物是程序。输入:值得是通过外接设备向程序输入;输出:程序箱外界设备输出内容。
特别需要理解的是: File类是一个重要的IO的应用。需要理解以下几个概念:
FileStream是一个双向流,既可以读也可以写;
StreamWriter:单向流---输出;
StreamReader:单向流---输入。
下面是在老师的领导下写的一个综合的实例,其中8个练习的Test()函数,有助于自己深刻理解运用File类相关知识:
View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Security.AccessControl; namespace StudyIO { class Program { static void Main(string[] args) { // Directory.CreateDirectory("d:\\ss"); //string[] strs = Directory.GetFiles("d:\\mp3"); //foreach (string str in strs) //{ // Console.WriteLine(str); //} string[] strs = Directory.GetFileSystemEntries("e:\\ftppublish"); foreach(string s in strs) { if (Directory.Exists(s)) { string[] ss = Directory.GetFileSystemEntries(s); foreach(string fs in ss) { Console.WriteLine(fs); } } } } static void Test8() { Stream streams = File.Open("D:\\1.cs", FileMode.Open); Stream streamw = File.Open("D:\\1.cs", FileMode.Open); BufferedStream stream = new BufferedStream(streamw); // stream.Write(); // stream.Read(); } static void Test7() { FileStream stream = File.Open("d:\\1.cs", FileMode.Open); BinaryReader reader = new BinaryReader(stream); byte[] buffer = new byte[1024]; int i = 0; string str = ""; while ((i = reader.Read(buffer, 0, buffer.Length)) != 0) { str += Encoding.UTF8.GetString(buffer, 0, i); } reader.Close(); stream.Close(); Console.WriteLine(str); } static void Test6() { //FileStream stream = File.Open("D:\\1.cs", FileMode.Append); //StreamWriter writer = new StreamWriter(stream); //writer.Write("你好"); //writer.Close(); // Test5(); } static void Test5() { //只是单独操作字符 StreamReader reader = new StreamReader("d:\\1.cs",Encoding.UTF8); //先读 string str = reader.ReadLine(); while (str != null) { Console.WriteLine(str); str = reader.ReadLine(); } reader.Close(); } static void Test4() { //1,读源文件 FileStream read = File.Open(@"E:\FTPPUBLISH\学习资料\[电影天堂-www.dy2018.net]龙门飞甲.720p.HD中文字幕.rmvb", FileMode.Open); long count = read.Length; //2,写文件 FileStream write = File.Open("d:\\23.rmvb", FileMode.OpenOrCreate); byte[] buffer = new byte[1024 * 1024 * 4]; int i = 0; int r = 0; while ((i = read.Read(buffer, 0, buffer.Length)) != 0) { r = r + i; string s = (((double)r / count) * 100).ToString("0.00") + "%"; Console.WriteLine(s); write.Write(buffer, 0, i); } write.Close(); read.Close(); } static void Test3() { FileStream fs = File.Open("d:\\1.cs", FileMode.Open); //默认缓冲区为1024,每次从文件(文件流)读1024个字节 byte[] buffer = new byte[1024]; //当程序读文件的收,把读取的自己从缓冲流的第一个元素开始放。 //已经读取的字节数,如果i=0的话,说明已经读取到末尾了,从而结束循环 int i = 0; string result = ""; while ((i = fs.Read(buffer, 0, 1024)) != 0) { Console.WriteLine(i); result += Encoding.UTF8.GetString(buffer, 0, i); } fs.Close(); Console.WriteLine(result); } static void Test2() { //写操作 FileStream fs = File.Open("d:\\1.cs",FileMode.Open); //向文件中写内容 string str = "这是C#的IO操作"; byte[] buffer = Encoding.UTF8.GetBytes(str); fs.Write(buffer,0,buffer.Length); fs.Close(); } static void Test() { //File.Create("d:\\1.cs"); //File.Copy("d:\\12.mp3", "E:\\刀剑如梦.mp3"); //File.Delete("E:\\刀剑如梦.mp3"); //File.Move("d:\\12.mp3", "E:\\刀剑如梦.mp3"); // FileAttributes fa = File.GetAttributes("E:\\刀剑如梦.mp3"); // Console.WriteLine(fa); // DateTime dt = File.GetCreationTime("E:\\刀剑如梦.mp3"); // Console.WriteLine(dt.ToString()); } } }
第四:多线程----进程:一个应用程序就是一个进程,一个进程中可以包含多个线程。以前在学校学操作系统的时候学过有关多线程的一些知识,不过似乎现在学C#涉及的并没有以前学的那么多和深,或许还没达到那个水平吧。
下面是一个很简单很容易理解的多线程源代码:
View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace StudyThread { class Program { static void Main(string[] args) { //创建一个线程 Thread thread = new Thread(new ThreadA().test); //线程处于就绪状态,没有执行 thread.Start(); for (int i = 0; i < 100; i++) { //让当前线程休息500毫秒,当阻塞结束处于就需状态 // Thread.Sleep(500); Console.WriteLine("我是主线程" + i); } } } public class ThreadA { public void test() { for (int i = 0; i < 100; i++) { //Thread.Sleep(1000); Console.WriteLine("我是子线程" + i); } } } }