.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();
常用的方法
介绍几个方法
类与类之间的关系,是否实现了接口







类似的操作…
通过反射调用方法:


.net基础总复习(3)的更多相关文章
- C#基础总复习02
继续更新第二篇: 1:一元运算符:++ -- ++:不管是前加加还是后加加,变量的值最终都会自身加一. 前加加和后加加的区别体现在参与运算的时候,如果是后加加,则首先拿原值参与运算, 运算完成后再自身 ...
- C#基础总复习01
马上就快毕业了,准备把这几个月所学到的知识梳理一下,这儿所写的都是一些C#中最基础的东西(大牛不要笑话我,这也是我记录的一些笔记等等),希望能帮到一些正在学习这方面的知识的人,如果有写的不对的地方,望 ...
- Day 20 python基础总复习
一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...
- .net基础总复习(2)
第二天 文件操作常用类 File类 //操作文件的 //复制.剪切.创建.移除 //File.Create(@"C:\Users\BDSOFT\Desktop\new.txt" ...
- .net基础总复习(1)
第一天 1.new关键字 (1) 创建对象 (2) 隐藏从父类那里继承过来的成员 2.访问修饰符 public: 公开的,公共的. private:私有的,只能在当前类的内部访问,类中的成员, 如果不 ...
- C#基础总复习03
继续更新...接下来就是面向对象的知识了 1.面向对象:概念:使用面向对象的思想进行编程可以让的程序变得扩展性更高,便于维护: 我们在现实生活中去描述一个人的时候,通过描述这个人的特征和行为. 我们在 ...
- EF6 在原有数据库中使用 CodeFirst 总复习(三、重建迁移)
本来原来学的时候,挺顺利的,没想到再次使用,还是遇到很多问题,导致更新失败,所以,只能重建迁移,免得看着乱乱的. 一.删除迁移,将数据恢复到(一)结束状态 1.删除文件夹 2.删除表 3.删除列 4. ...
- EF6 在原有数据库中使用 CodeFirst 总复习(五、生成发帖页面)
有点与在原有数据库中使用 CodeFirst 远了,不过是总复习吗,总得全面点. 一.在用户表(Users)中插入两个用户 二.生成发帖界面 MVC生成的界面很多,也没使用Ajax,实际开发中很少会使 ...
- DAY25、面向对象总复习
面向对象总复习:面向过程编程思想: 核心是 过程 二字, 过程指的是解决问题的步骤是,即先干什么再干什么. 基于该编程思想编写程序,相当于一条流水线,一种机械式的思维方式. 面向对象编程思想: 核心是 ...
随机推荐
- Linux crontab 在每月最后一天执行
59 23 * * * if [ `date +%d -d tomorrow` = 01 ]; then; command(/usr/bin/curl -s -o temp.txt http:// ...
- CentOS 7 yum 安装redis(更简单)
一.安装redis 1.检查是否有redis yum 源 1 yum install redis 2.下载fedora的epel仓库 1 yum install epel-release 3.安装re ...
- 【JavaScript框架封装】公共框架的封装
/* * @Author: 我爱科技论坛 * @Time: 20180706 * @Desc: 实现一个类似于JQuery功能的框架 // 公共框架 // 种子模块:命名空间.对象扩展.数组化.类型的 ...
- xx-net安装配置
同学们,有没有因为不会FQ而痛苦?本小白就蛋疼了很久,今天终于把xx-netFQ工具给配置好了,拿出来和大家分享下. 首先,需要先下载xx-net,地址为:https://github.com/XX- ...
- Project Euler 2 Even Fibonacci numbers
题意:斐波那契数列中的每一项都是前两项的和.由1和2开始生成的斐波那契数列前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -考虑该斐波那契数列中不超过四百万的项,求其 ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- Vue.js 渲染简写样式存在的问题
引出问题 首先我们来这么一个问题, 这里是完整的 jsfiddle demo or codepen demo 给一个元素绑定两个边框样式, 右侧和底部都为1px的红色边框 styleA: { bord ...
- java的值传递与引用传递
一. 经常搞不清楚,当一个对象做为参数传入到方法中时,为啥有时候值能被改变,有时候又不会改变,以下说明原因: 1.当传入的参数,在方法中能被改变的为 引用传递 2.当传入的参数,在方法中没被改变的为 ...
- springMVC入门截图
mvc在bs系统下的应用 ---------------------------------------------------- 在web.xml中配置前端控制器(系统提供的一个servlet类 ...
- 屌丝、小白怎么拿国内巨头offer
不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕仰慕.看看这些牛人,NOI金牌.开源社区名人,三年级開始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...