学习的点点滴滴

   前段时间学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
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
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);
            }
        }
    }
}

 

 

posted on 2012-08-11 21:13  兰@net  阅读(2121)  评论(3编辑  收藏  举报

学无止尽