C#高级
程序集
程序集概念:
程序集是.net中的概念。
.net中的dll与exe文件都是程序集。(exe与dll的区别(exe有程序主入口,可以执行,dll没有主入口,不可运行))
程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包(*)
程序集的内容:
程序集包含:
类型元数据(描述在代码中定义的每一类型和成员,二进制形式)
程序集元数据(程序集清单、版本号、名称等)
IL代码(这些都被装在exe或dll中)
资源文件
每个程序集都有自己的名称、版本等信息。这些信息可以通过AssemblyInfo.cs文件来自己定义
程序集的好处:
程序中只引用必须的程序集,减小程序的尺寸。
程序集可以封装一些代码,只提供必要的访问接口。
添加程序集引用:
添加路径、项目引用、GAC(全局程序集缓存)(了解)
不能循环添加引用
在c#中添加其他语言编写的dll文件的引用。(参考P/Invoke,在.net中调用非程序集的dll)
反射
反射:
就是动态获取程序集中的元数据来操作类型
反射中的一个重要的类(type):
获取type的来那个中方法:
通过类获得Type:Type t = typeof(Person)
通过对象获得类的Type:Type t = p.GetType()
Type类的一些常用验证方法:
bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。
IsAbstract,判断是否为抽象的,含接口
关于Assembly的介绍:
加载程序集方法:
Assembly asm=Assembly.LoadFile(“c:\abc.dll”);
调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型
调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型
调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息
动态创建对象:
Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错
GetConstructor(参数列表);//这个是找到带参数的构造函数
动态调用的一些成员:
MemberInfo类 抽象类,有很多子类,下面讲的类都继承自它,获取程序集成员的相关信息(类型、方法、事件、字段和属性)
PropertyInfo 获取属性
主要成员:CanRead、CanWrite、PropertyType属性类型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。 pInfo.SetValue(p1, 30, null)
MethodInfo 获取方法
MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。
FieldInfo 获取字段
EventInfo 获取事件
反射若干场景(了解):
1.插件机制,保证了程序的封装性,同时提高了程序的可扩展性。
2.asp.net中根据用户访问的页面动态创建页面对象,比如访问Index.aspx,则根据访问的页面名称Index,通过反射动态创建该类型的对象。(在aspx页面中执行<%=System.Reflection.Assembly.GetExecutingAssembly().Location %>,查看dll中页面生成的的类名)
3.数据访问层中使用工厂模式时,根据配置文件动态创建数据访问层对象。
4.各种框架中,修改配置文件即可实现不同效果,都用到了反射。
5.访问类中的私有成员
6.各种需要动态创建类对象的场景都可以使用
隐式类型:
var关键字(在编译时已经能确定变量的类型了。并不是弱类型。)
var i = 5;//int
var j = 23.56;//double
var k = "C Sharp";//string
var x;//错误
var y = null;//错误
var z = { 1, 2, 3 };//错误 var z=new[] {1,2,3};//正确。
var 强类型.根据后面的值自动推断类型,编译时把推断的类型替换掉var
只是方便程序员使用而已。
不能作为类成员的类型、不能用作方法的参数,返回值。(只能用作局部变量的类型推断)
匿名类型:
var p1 = new { Id = 1, Name = "YJingLee", Age = 22 };//属性也不需要申明
var p2 = new { Id = 2, Name = "XieQing", Age = 25 };
数组
var intArray = new[] { 2, 3, 5, 6 };
var strArray = new[] { "Hello", "World" };
var objArray= new[] { new { Name = "YJingLee", Age = 22 }, new { Name = "XieQing", Age = 25 } };
扩展方法:
将扩展方法放到一个单独的类中,类声明为static(静态类),方法是静态方法,并且在第一个string上增加this。哇,string类“增加”扩展方法方法了,这只是假象,本质上仍然是静态方法,只不过C#提供了这样一个便利给大家,扩展方法内部不能调用被扩展类的私有、protected的东西。
声明扩展方法的步骤:类必须是static,方法是static,第一个参数是被扩展的对象,前面标注this(this 数据类型 参数名)。使用扩展方法的时候必须保证扩展方法类已经在当前代码中using
初始化器:
对象初始化器
Student stu= new Student(){ Id = 1, Name = "YJingLee", Age = 22 };
更方便给对象赋值,在构造函数之后执行赋值,看IL代码。
集合初始化器
List<int> num = new List<int> (){ 0, 1, 2, 6, 7, 8, 9 };
List< Student > stus= new List< Student >
{ new Student{Id=1,Name="YJingLee",Age=22},
new Student{Id=2,Name="XieQing",Age=25}, };
XML(可扩展标记语言)
Xml语法特点:
- 严格区分大小写
- 有且只能有一个根节点
- 有开始标签必须有结束标签
- 属性必须使用双引号
- 没有预定义标签与html不一样
- 文档声明:<?xml version="1.0" encoding="utf-8"?>
- 注释:<!-- -->
- CDATA区:即原意文本-<![CDATA[…]]>
- 注意编码问题,文本文件实际编码要与文档声明中的编码一致。
Xml读写(Dom XmlDocumnet demo):
l 两种方式,推荐使用第二种:
n XmlDocument
n XDocument、(XElement、XAttribute)
XmlDocument xdoc=new XmlDocument();
//文档声明
xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0","utf-8",null));
//添加根节点
XmlElement xeroot=xdoc.CreateElement("Order");
xdoc.AppendChild(xeroot);
XmlElement xeCust =xdoc.CreateElment("CustomerName");
xeCust.InnerText="老杨";
xeroot.AppendChild(xeCust);
XmlElement XeOrderName=xdoc.CreateElment("OrderName");
xeorderName.InnerText ="bj200000";
Xeroot.AppendChild(xeOrderName);
XmlElement xeItem=xdoc.CreateElement("Items");
xeroot.AppendChild(xeItem);
XmlElement order1=xdoc.CreateElement("OrderItem");
order1.SetAttribute("Name","电脑");
order1.SetAttribute("Count",30);
Xpath简介:
常用语法:
/AAA 选择根元素AAA
/AAA/CCC 选择AAA元素下的所有CCC子元素
/AAA/BBB/CCC 选择AAA元素下子元素BBB下所有CCC字元素
//BBB 选择所有BBB子元素
//* 选择所有元素
/AAA/BBB[1] 选择AAA下第一个BBB子元素
//@id 选择所有有id属性的元素
//BBB[@id] 选择有id属性的BBB元素
//BBB[NOT(@*)] 选择没有属性的BBB元素
//BBB[@id=’b1’] 选择id为b1的BBB元素
//*[COUNT(BBB)=2] 选择含有两个BBB子元素的元素
等等…….. 用的时候可以查找
深拷贝与浅拷贝
深拷贝是把所有的数据都拷贝一份,包括引用都会拷贝,而浅拷贝只是把值类型拷贝一份,而引用类型则没有。
图例:
浅拷贝的实现(demo):
/// <summary> /// 实现对象的浅拷贝 /// </summary> /// <returns></returns> public Person QianKaoBei() { //MemberwiseClone()方法从object类中继承下来 //作用就是把当前对象浅拷贝一份 //浅拷贝当前对象 return (Person)this.MemberwiseClone(); } |
深拷贝(序列化实现):
static object DeepCopy(object src) { BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone)); using (MemoryStream stream = new MemoryStream()) { Formatter.Serialize(stream, src); stream.Position = 0; return Formatter.Deserialize(stream); } } |
Attribute特性(attribute)
是被指定给某一声明的一则附加的声明性信息
就是一个标签,在使用当前类的地方,通过反射获取该特性
Attribute就是类,Attribute类名一般都以Attribute结尾,使用的时候不用加Attribute这个结尾。使用Attribute的时候给的参数其实就是构造函数
反编译DisplaynameAttribute,发现没有特殊代码。标签本身是没有含义,只是起到标注的作用,具体怎么解释、使用这个标识,是由使用者来决定:属性视图窗口、C#编译器。相当于在放上画一个“拆”,本身这个字没有含义。
自定义特性(核心 反射):
Attribute都从System. Attribute类继承,类名一般以Attribute结尾
创建构造函数
标记类的用途—AttributeUsage标记(标记的标记):AttributeTargets:可以添加到哪些成员上。AllowMultiple:是否允许在一个成员上标记这个Attribute的多个实例,默认false。标注在Attribute类的类名上方。
Attribute只是给类、成员做标记,本身没有什么意义,不会发生任何动作,就像小偷踩点在门上做标记(StealableAttribute)一样,具体这个标记会起到什么作用是由使用这个类、成员的代码决定的。
Property.GetCustomerAttribute()
C#高级的更多相关文章
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
- 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)
马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...
- JS高级前端开发群加群说明及如何晋级
JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...
- Visual Studio 宏的高级用法
因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...
- [译]基于GPU的体渲染高级技术之raycasting算法
[译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...
- 高薪诚聘熟悉ABP框架的.NET高级开发工程师(2016年7月28日重发)
招聘单位是ABP架构设计交流群(134710707)群主阳铭所在的公司-上海运图贸易有限公司 招聘岗位:.NET高级开发工程师工作地点:上海-普陀区 [公司情况]上海运图贸易有限公司,是由易迅网的创始 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- MongoDB高级查询详细
前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前 ...
随机推荐
- java类转化为json对象
方式一:使用jar包,直接转化成json格式,再使用outwrite写到jsp中 先说说要使用到的包commons-beanutils.jar.commons-collections.jar.comm ...
- haproxy配置直接重定向url
在邮件列表看到有个人问haproxy能否在接到一个请求时选择一个后端服务器,然后301重定向url .主要原因是他有5个1G的出口,这样就能充分利用其带宽.测试了一下是可以的 frontend fre ...
- Web---JSP注册技术的的演绎(3代)-JSP/EJB/Servlet/POJO/JavaBean
我们可以这么理解JSP注册技术的发展过程: 第一代JSP技术:纯JSP开发. 第二代JSP技术:JSP+EJB开发. (EJB简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行.) 第三代J ...
- SSAS使用MDX生成脱机的多维数据集CUB文件
在运用多维数据进行分析的时候,通常很有可能我们需要把这些多维数据脱机进行处理或演示,这其中就要用到cub文件 http://www.cnblogs.com/yunhuasheng/archive/20 ...
- 各种sensor名称统计
gyroscopes 陀螺仪accelerometers 加速度计magnetometers 磁力计barometric pressure 气压remote pressure sensing 远程压力 ...
- YUV格式总结
1. YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间.在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取 ...
- Linux设备驱动中的异步通知与异步I/O
异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...
- 非阻塞,send后马上close消息能成功发出去吗
send返回成功的话就能. 判断send返回,假如返回的值是成功,则说明要发送的放到了tcp的发送缓冲区内了,然后在close的话等于再放了一个关闭信号到缓冲区里的. 由于TCP是有序的,假如对端此时 ...
- ORA-01653:表空间扩展失败的问题(开启表空间自动扩展)
----查询表空间使用情况---使用DBA权限登陆SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间 ...
- 使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理 -摘自网络
在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. ...