• .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:UsersBDSOFTsource eposConsoleApp17MyClassinDebugMyClass.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();

    常用的方法

    介绍几个方法

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

     

     

    类似的操作…

    通过反射调用方法:

  • 相关阅读:
    IIS10中使用OpenSSL来创建CA并且签发SSL证书
    vim简单题练习-------出自《鸟哥的linux私房菜》第309页码题目
    Linux删除命令rm
    CentOS下Vim加密解密文本
    Linux中bash shell环境变量
    Linux文件系统损坏导致无法正常启动与fsck修复工具
    rm -rf /*时遇到的趣事
    Linux中tree无法正常显示中文的解决方法
    执行shell脚本的四种方式
    私有网络(VPC)概述
  • 原文地址:https://www.cnblogs.com/eret9616/p/8818758.html
Copyright © 2020-2023  润新知