.net基础总复习(3)

第三天

 

2.单例模式

1)  将构造函数私有化

2)  提供一个静态方法,返回一个对象

3)  创建一个单例

3.XML 可扩展的标记语言

XML:存储数据

注意:

XML严格区分大小写,并且成对出现。

XML 文档有且只能有一个根节点。

 

 

 

节点:node

元素:element

 

static void Main(string[] args)

        {

            //通过代码来创建XML文档

            //1引用命名空间

            //2创建XML文档对象

 

            XmlDocument doc = new XmlDocument();

            //创建第一行描述信息并且添加到doc文档中

 

            XmlDeclaration dec =  doc.CreateXmlDeclaration("1.0", "utf-8", null);

 

            doc.AppendChild(dec);

 

            //4、创建根节点

            XmlElement books = doc.CreateElement("Books");

 

            //将根节点添加到文档中

            doc.AppendChild(books);

 

            //5、给根节点Books创建子节点

            XmlElement book1 =  doc.CreateElement("Book");

            //将book添加到根节点

 

            books.AppendChild(book1);

 

 

            //6、给Book1添加子节点

            XmlElement name1 = doc.CreateElement("Name");

 

            name1.InnerText = "金pingmei";

            book1.AppendChild(name1);

 

            XmlElement price1 = doc.CreateElement("Price");

            price1.InnerText = "10";

 

            book1.AppendChild(price1);

 

            XmlElement des1 = doc.CreateElement("Des");

            des1.InnerText = "好看";

 

            book1.AppendChild(des1);

 

 

            XmlElement book2 = doc.CreateElement("Book");

            books.AppendChild(book2);

 

            XmlElement name2 = doc.CreateElement("Name");

 

            name2.InnerText = "金pingmei";

            book2.AppendChild(name1);

 

            XmlElement price2 = doc.CreateElement("Price");

            price2.InnerText = "10";

 

            book2.AppendChild(price2);

 

            XmlElement des2 = doc.CreateElement("Des");

            des2.InnerText = "好看";

 

            book2.AppendChild(des2);

 

            doc.Save("Books.xml");

 

            Console.WriteLine("保存成功");

 

            Console.ReadKey();

        }

 

 

    

 

XML追加内容

static void Main(string[] args)

        {

            //追加XML文档

            XmlDocument doc = new XmlDocument();

 

            if (File.Exists("Books.xml"))

            {

                //如果文件存在 加载XML

                doc.Load("Books.xml");

                //获得文件的根节点

                XmlElement books =   doc.DocumentElement;

            }

            else

            {

                //如果文件不存在

                //创建第一行

                XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);

                doc.AppendChild(dec);

                //创建根节点

 

                XmlElement books = doc.CreateElement("Books");

                doc.AppendChild(books);

 

            }

           

           

            //如果文件存在

            //如果文件不存在

 

        }

 

 

读取XML文档

XmlDocument doc = new XmlDocument();

//加载要读取的XML

doc.Load(“Books.xml”);

 

//获得根结点

XmlElement books = doc.DocumentElement;

 

//获得子节点

XmlNodeList xml = books.ChildNodes;

 

foreach ( XmlNode item in xml)

{

Console.WriteLine(item.InnerText);

}

Console.Readkey();

 

通过Xpath直接得到属性中的值

 

//Xpath

XmlDocument doc = new XmlDocument();

doc.Load(“Order.xml”);

XmlNodeList xnl = doc.SelectNodes(“/Order/Items/OrderItem”);

foreach(XmlNode item in xnl)

{

Console.WriteLine(node.Attributes[“Name”].Value);

Console.WriteLine(node.Attributes[“Count”].Value);

}

Console.ReadKey();

 

 

删除节点

XmlDocument doc = new XmlDocument();

doc.Load(“Order.xml”)

XmlNode xn = doc.SelectSingleNode(“/Order/Items”);

xn.RemoveAll();

doc.save(“Order.xml”);

Console.WriteLine(“删除成功”);

Console.Readkey();

 

 

委托语法

1、     为什么要使用委托

将一个方法作为参数传递给另一个方法。

2、     委托概念

声明一个委托类型。

委托所指向的函数必须跟委托具有相同的签名。

3、     匿名函数

4、     练习:使用委托求数组的最大值

5、     练习:使用委托求任意数组的最大值

6、     泛型委托

7、     多播委托

8、     Lambda表达式

9、     使用委托来实现窗体传值

 

提出问题:

想写一个大写、小写、加引号的函数,那么怎么写方便点?

答:要是能把方法作为参数传递给另一个函数就好了。

 

 

 

 

//声明一个委托指向一个函数

public delegate void DelSayHi(string name);

 

class Program

    {

        static void Main(string[] args)

        {

 

            DelSayHi del = new DelSayHi(SayHiChinese);

 

           //或者  DelSayHi del = SayHiEnglish;

 

            del("张三");

            Console.ReadKey();

            //Test("张三",)

 

        }

 

        public static void Test(string name,DelSayHi del)

        {

            //调用

            del(name);

 

        }

 

        public static void SayHiChinese(string name)

        {

            Console.WriteLine("吃了么" + name);

        }

 

        public static void SayHiEnglish(string name)

        {

            Console.WriteLine("Nice to meet you" + name);

        }

 

    }

 

  封装一下:

匿名函数

 

可以直接把一个函数赋给一个委托(前提是函数与委托的签名都一样)

 

如果一个函数就执行一次,那么干脆写成匿名函数好了。

Lambda表达式:

 

 

练习:使用委托求数组的最大值(任意类型数组)

 

 

泛型委托

 

//泛型委托

    public delegate int DelCompare<T>(T t1, T t2);

  

 

    class Program

    {

 

 

        static void Main(string[] args)

        {

            // int[] nums = { 1, 2, 3, 4, 5, 6 };

 

            //int max =  GetMax<int>(nums, Compare1);

            // Console.WriteLine(max);

            // Console.ReadKey();

 

            string[] names = { "asdasdsad", "sdsd", "ASDASDSADASD" };

            string max = GetMax<string>(names, (string s1, string s2)=> {

                return s1.Length - s2.Length;

            });

 

            Console.WriteLine(max);

 

            Console.ReadKey();

 

        }

 

        public static T GetMax<T>(T[] nums, DelCompare<T> del)

        {

            T max = nums[0];

 

            for (int i = 0; i < nums.Length; i++)

            {

                //要传一个比较的方法

                if (del(max, nums[i]) < 0)

                {

                    max = nums[i];

                }

            }

            return max;

        }

 

 

        public static int Compare1(int n1,int n2)

        {

            return n1 - n2;

        }

 

 

    }

 

 

Lambda表达式

 

            //没参数没返回值

          //  DelOne del =  delegate () { };

 

            DelOne del = () => { };

 

            //  有参数没返回值

            //  DelTwo del2 = delegate (string name) { };

            DelTwo del2 = (string name) => { };

 

            //既有参数又有返回值

            //DelThree del3 = delegate (string name) { return name; };

 

            DelThree del3 = (string name) => { return name; };

 

 

            //泛型集合

            List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

 

            list.RemoveAll(n => n > 4);

 

            foreach (var item in list)

            {

                Console.WriteLine(item);

            }

 

            Console.ReadKey();

 

 

*使用委托来进行窗体传值

*多播委托

委托可以指向多个函数

 

事件

 

public event MyDelegate _mdl;

 

//委托可以直接调用 不是很安全

//事件不能直接调用 所以我们用事件

 

事件不能被直接赋值,只能+=、-=。

 

EventHandler

windows系统中的一个委托

 

委托和事件的区别

委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装。),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。

(举例子:三种实现事件方式的区别(直接用委托实现、用私有委托+公有方法模拟事件,直接用event事件实现))

 

Eventhandler 就是事件不带委托参数的。给你举个例吧

public Event Eventhandler  ClickEvent;

其实就等同于声明  
public delegate void Eventhandler();
public Event Eventhandler ClickEvent;

 

 

反射

 

 

程序集——类的集合

.net中:

.exe .dll都属于程序集,并不是真正的可执行文件。

除非有.Net framework才能运行

反射

 

反射无处不在,VS的智能提示…就是通过反射获取..

 

using System.Reflection;

 

        //关于程序集

        static void Main(string[] args)

        {

            Person p = new Person();

           

            //获取p的Type

            Type tp = p.GetType();

 

 

        /*除了使用对象获取,还有另一种方式

         

          Type tp = typeof(Person);

 

*/

 

           

            /*获得所有方法

           

            //获取当前tp对象的所有的公共的方法

            MethodInfo[] meths =  tp.GetMethods();

 

            //遍历所有的方法

            for (int i = 0; i < meths.Length; i++)

            {

                //打印方法的名字

                Console.WriteLine(meths[i].Name);

            }

             */

 

 

            /*获取所有公共属性

            PropertyInfo[] pros = tp.GetProperties();

 

            for (int i = 0; i < pros.Length; i++)

            {

                Console.WriteLine(pros[i].Name);

            }

            */

 

 

          

 

          

            Console.ReadKey();

 

        }

    }

 

    public class Person

    {

        private int _age;

 

        //属性就是方法(get方法,set方法)

        public int Age { get => _age; set => _age = value; }

 

        public void Say()

        {

            Console.WriteLine("Hello");

        }

}

 

通过获取程序集中所有的类

 

在.cs文件中我们已经学会了反射,那么怎么在.dll文件中使用反射呢?

 

 

/从该路径中获取指定的程序集

            Assembly ass =  Assembly.LoadFile(@"C:\Users\BDSOFT\source\repos\ConsoleApp17\MyClass\bin\Debug\MyClass.dll");

 

            Type[] tps = ass.GetTypes();

 

            for (int i = 0; i < tps.Length; i++)

            {

                Console.WriteLine(tps[i].Name);

                Console.WriteLine(tps[i].Namespace);

                Console.WriteLine("================");

 

            }

 

            Console.ReadKey();

 

 

 

常用的方法

介绍几个方法

类与类之间的关系,是否实现了接口

 

 

 

 

 

类似的操作…

 

 

 

通过反射调用方法:

 

 

 

 

 

 

 

 

 

posted @ 2018-04-13 10:33  hh9515  阅读(154)  评论(0编辑  收藏  举报