第三天

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. HDU-3015 Disharmony Trees [数状数组]

    Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...

  2. javaScript原型、闭包和异步操作

    同学们,这篇博客有点水了,并不是说我不想写这块的内容,是因为查了很多资料,看了很多帖子之后,发现园内王福朋老师写的这系列文章真的很好,他的这系列的博客我已经看了3.4遍了,每一次都有新的收获,我可写不 ...

  3. Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )

    题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...

  4. linux下RTP编程(使用JRTPLIB)(转)

    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关键 ...

  5. Hibernate之HQL基本用法

    关于HQL HQL与SQL非常类似,只不过SQL的操作对象是数据表,列等对象,而HQL操作的是持久化类,实例,属性等. HQL是完全面向对象的查询语言,因此也具有面向对象的继承,多态等特性. 使用HQ ...

  6. 在magento的eav模型中如何在更新记录时只在value表的原值上更新

    1,一般情况下,当我们在调用getModel在load某条实体接着更新对应实体上的值是,都不会覆盖原来的实体value表上的值,而是保留原来的,并在value表上重新创建一条值记录,比如初始表如下: ...

  7. [using_microsoft_infopath_2010]Chapter12 管理监视InfoPath表单服务

    本章概要: 1.在SharePoint中心控制台管理InfoPath设置 2.分析监视浏览器表单开考虑潜在性能问题 3.最小化回发数据

  8. CountDownLatch使用方法

    CountDownLatch是一个同步辅助类,在完毕一组正在其它线程中运行的操作之前.它同意一个或多个线程一直等待. 如果我们周末要去旅游.出游前须要提前订好机票.巴士和酒店,都订好后就能够出发了.这 ...

  9. [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法

    看看我们机房某畸形写的题解:http://blog.csdn.net/sinat_27410769/article/details/46754209 此题为popoQQQ神犇所出,在此orz #inc ...

  10. Web Service学习-CXF开发Web Service实例demo(一)

    Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...