第三天

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();

常用的方法

介绍几个方法

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

类似的操作…

通过反射调用方法:

.net基础总复习(3)的更多相关文章

  1. C#基础总复习02

    继续更新第二篇: 1:一元运算符:++ -- ++:不管是前加加还是后加加,变量的值最终都会自身加一. 前加加和后加加的区别体现在参与运算的时候,如果是后加加,则首先拿原值参与运算, 运算完成后再自身 ...

  2. C#基础总复习01

    马上就快毕业了,准备把这几个月所学到的知识梳理一下,这儿所写的都是一些C#中最基础的东西(大牛不要笑话我,这也是我记录的一些笔记等等),希望能帮到一些正在学习这方面的知识的人,如果有写的不对的地方,望 ...

  3. Day 20 python基础总复习

    一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...

  4. .net基础总复习(2)

    第二天 文件操作常用类 File类   //操作文件的 //复制.剪切.创建.移除 //File.Create(@"C:\Users\BDSOFT\Desktop\new.txt" ...

  5. .net基础总复习(1)

    第一天 1.new关键字 (1) 创建对象 (2) 隐藏从父类那里继承过来的成员 2.访问修饰符 public: 公开的,公共的. private:私有的,只能在当前类的内部访问,类中的成员, 如果不 ...

  6. C#基础总复习03

    继续更新...接下来就是面向对象的知识了 1.面向对象:概念:使用面向对象的思想进行编程可以让的程序变得扩展性更高,便于维护: 我们在现实生活中去描述一个人的时候,通过描述这个人的特征和行为. 我们在 ...

  7. EF6 在原有数据库中使用 CodeFirst 总复习(三、重建迁移)

    本来原来学的时候,挺顺利的,没想到再次使用,还是遇到很多问题,导致更新失败,所以,只能重建迁移,免得看着乱乱的. 一.删除迁移,将数据恢复到(一)结束状态 1.删除文件夹 2.删除表 3.删除列 4. ...

  8. EF6 在原有数据库中使用 CodeFirst 总复习(五、生成发帖页面)

    有点与在原有数据库中使用 CodeFirst 远了,不过是总复习吗,总得全面点. 一.在用户表(Users)中插入两个用户 二.生成发帖界面 MVC生成的界面很多,也没使用Ajax,实际开发中很少会使 ...

  9. DAY25、面向对象总复习

    面向对象总复习:面向过程编程思想: 核心是 过程 二字, 过程指的是解决问题的步骤是,即先干什么再干什么. 基于该编程思想编写程序,相当于一条流水线,一种机械式的思维方式. 面向对象编程思想: 核心是 ...

随机推荐

  1. jquery bind 传参数

    方法一. ? 1 2 3 4 function GetCode(event) { alert(event.data.foo); } ? 1 2 3 4 $(document).ready(functi ...

  2. preload、prefetch的认识

    预加载 现在的网络情况虽然很乐观,但是 defer和async 当浏览器碰到 script 脚本的时候: <script src="script.js"></sc ...

  3. Problem 5

    Problem 5 # Problem_5.py """ 2520 is the smallest number that can be divided by each ...

  4. mysql 插入更新在一条sql ON DUPLICATE KEY UPDATE

    有时候需要进行数据操作的,如果有数据则更新数据, 没有数据则插入. 以往的做法是先查询,再根据查询结果进行判断,执行插入或更新操作 其实 有一种 ON DUPLICATE KEY UPDATE 语法, ...

  5. C++ decltype类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 declt ...

  6. BA-传感器

    01.室内温度传感器 壁装,西门子,QAA2061D 1.默认范围:温度0-50℃,湿度0-100% 2.供电方式:24vac 3.穿线方式:4芯屏蔽线 02.风管温度传感器 西门子,QAM2120. ...

  7. HDU 4340

    好题一道啦.做这题时,抓住两个问题:一.给某点染色时,其连通的点是否已有一点以全部代价染色.二.该点染什么颜色. 嗯.第二个问题很容易,但第一个问题不容易了.我一开始就考虑祖父子三层结点的关系,认为在 ...

  8. HDU 3306

    先转一些   http://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html Fibonacci数列:F(0)=1 , F(1)=1 ...

  9. IP协议解读(三)

    今天我们来介绍网络层中的ICMP协议 ICMP报文格式 图一: 从图片上我们能够分析出.前三位的字段都是固定的.8位类型字段,8位代码字段.16位校验和字段.其它字段因ICMP报文类型不同而不同.8位 ...

  10. Android 进程常驻(5)----开机广播的简单守护以及总结

    这是一个轻量级的库,配置几行代码.就能够实如今android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下.clean master获取root权限下都无法杀死进程 支持系统2.3到 ...