• 1,参数传递.

默认都是按值传递(无论引用还是值类型),也就意味着传递参数的一个副本给方法.之后在方法体内对参数的更改,对原始参数没有影响.

使用ref/out可以按引用传递,直接影响原始参数变量.两者的区别是ref参数必须在传递之前进行初始化.在异步方法和迭代器方法中,不能使用它.

2,CTS,CLS

CTS是一个集合,符合它的规范的类型才能在CLR上运行.CLS是它的子集,因为C#中有的类型,在VB中可能没有(ulong).

默认不会进行CLS的检查,[assembly:System.CLSCompliant(true)]可以进行检查.

不符合CLS的代码,在不同语言间会出现复用的问题.

3,CLR

编译阶段,生成的是CIL组成的中间语言,然后在运行时由个平台的JIT来编译成机器指令进行运行,所以能够跨平台.

作用:1)管理内存(处理对象布局,管理对象引用,自动GC),2)线程执行,3)代码执行(可与非托管代码互操作,引用COM DLL),4)代码安全验证(取决于组件的来源)(以CTS验证Type),5)编译(CLR从不解释托管代码,由JIT编译代码),其可由高性能Server App承载并用托管代码编写逻辑.

4,GC

0代是新创建的对象,1代是经历过1次GC后留存的,2代是经历过1次以上GC留存的.回收时,先从0代开始.

5,is/as

  • is.如果被判断对象是null,那么返回false.
  • as.如果类型不兼容,那么返回null.
  • 两者都不会抛出异常.但是as更加高效.

6,接口/抽象类

  • 接口.不能含有Field和静态成员.可以作用于引用和值类型.
  • 抽象类.不能被new,不能sealed.实现其方法是用overriding.
  • "接口不变".当新增功能时,不能修改旧接口,而应该添加新的接口.接口应该设计为单一功能.
  • 当组件要被设计为多个版本时,是用抽象类.
  • 当功能要被使用在大范围的全异对象上时,使用接口.抽象类用于关系紧密的对象组.
  • 接口更适合于小而简练的功能.而抽象类可以有默认的实现.
  • 对于一个继承了多个接口的类,而多个接口中含有相同签名的方法,只需要实现一次即可.当需要分别实现时,必须显示指定,并且调用时需要类型转换.

7,Attribute特性

  • 本质上是Class,为目标元素提供关联附加信息.在运行时通过反射来获取该附加信息,来动态改变代码的执行方式.
  • 主要用于序列化,编译器指令,设计模式上.
  • 其实例在编译时初始化.
  • 所有特性都继承自System.Attribute.必须有公用的构造器.特性还可以应用到其他特性上.

8,Struct

  • 继承自System.ValueType(该类型为Ref类型),不具备多态性。
  • 值类型,存储在堆栈上.
  • 常用于存储数据。没有继承性。只能实现接口。
  • 只能定义带参构造器,不能有解析器,也不能有自定义无参构造(因为默认含有无参的Public构造).
  • 其可以不使用New初始化,但这样的话所有的字段都是未初始化状态,直到所有字段都完成初始化,否则引用它就会编译错误.
  • 可以重载Object的3个方法:Equals,ToString,GetHashTable.
  • struct变量使用完后,自动解除内存分配.
  • 用途:主要用于存储数据时,当数据量小时,结构数组有更高的效率,提供和非托管代码兼容性.

9,CTS

  • 目的是创建一个跨语言的,类型安全,高性能代码执行的框架.定义各个语言必须遵守的规则,以使得使用不同语言建立的对象能够进行交互.
  • CTS定义了MSIL使用的预定义类型.所有的.NET编译器都是基于CTS实现的,因为所有的程序最后都要被编译成IL.
  • CLS是CTS的子集,定义了面向.NET的开发语言所必须支持的最小集合.
  • CIL,IL定义了与机器无关的虚拟指令.在执行时IL会被翻译成本地代码.
  • .Net Framework可以看做CIL在Win平台下的实现.

10,参数

  • ref/out

    • 方法的定义和调用都需要有该keyword.否则编译错误.
    • 允许是否使用该keyword而带来的方法重载,而不能在两者之间进行.因为两者在编译后生成的IL代码是相同的.
    • ref传递的必须是一个初始化过的实际对象.
    • out可以接受null参数,但是在方法返回之前,必须进行赋值.同时,方法体内,会将外界赋给参数的值清空.
  • 按值/引用传递参数
    • 按值传递.引用类型传递的是该引用的值,即对象的地址.值类型传递的是该值的一个副本,所以修改参数的值不会影响原值.
    • 按引用传递.引用/值类型传递的都是引用/值的地址.

11,委托

  • 存放着对方法引用的引用类型.
  • 可在全局范围内定义.
  • 应用了策略模式.把变化的部分封装起来.然后再把封装的对象作为一个对象传递给方法作为参数.
  • 实际上是一个类,可以使用new来实例化生成对象.定义了方法的类型.
  • 允许把方法当做另一方法的参数来传递.
  • 分离了方法的声明和方法的实现.
  • 把对方法的引用封装在委托对象中.
  • 调用时,用一个委托对象的变量来替代方法名称.
  • 内部继承关系:MultiDelegate->Delegate.
  • 字段:_target(方法所在类的对象,静态方法时为null)._MethodPtr(标识要调用的方法)._invocationList(委托链).
  • 委托链也是委托.可进行的操作是+=/-=.使用GetInvocationList()来获取委托链.
  • 事件就是一种委托链.

Other

  • 枚举打印(toString)时,输出的是成员名称,而非1,2,3.
  • 类只能通过引用存储它的堆来访问.对引用赋值,只会创建引用的副本,而非实例的副本,然后所有的引用都指向同一存储区.
  • 可以使用Using来简化引用命名空间时的字符数.Using print= System.Consle.
  • 异常
    • 当没有Catch语句时,执行到Finally后停止,之后的代码会被忽略.
    • 有catch时,会执行完try-catch-finally,然后执行之后的代码.
    • throw Exception之后的代码不会被执行.
  • Box
    • 装箱是隐式发生的.
    • 而拆箱必须显式进行,并且类型要相同,兼容也不行.
  • 调用Windows API函数.

    • 引用System.Runtime.InterpServices;[DllImport(“XX”,Entry Point=”XXX”,CharSet=”XXXX”)]:XX为Dll所在的位置(User32.dll);XXX为所要引用的函数名,XXXX=UniCode/ANSI.

  • 继承
    • 子类使用new来覆盖父类的同名方法,然后再使用base.FunName()来调用被覆盖的父类方法.
  • 泛型
    • CLR允许值,引用,接口,委托的泛型,不支持枚举泛型.
    • CLR保证泛型并识别泛型的类型安全,并且不会产生拆箱,装箱动作.
    • 编译时T是一个占位符.实例化时根据不同的传入类型进行替换.
    • 不同的类型生成不同的代码(Class).各个类之间没有关系.
    • 静态变量在不同类型的Class之间不会共享.
    • 重载方法.在实例方法调用时检查(而非编译时).当一般方法与泛型方法签名相同时,一般方法优先.
    • 将泛型变量转换为另一类型为非法.除非另一类型兼容约束,可先转化为Object后在进行该转换;在没有约束类型为引用时,将泛型类型转化为NULL为非法.可指定默认值;与NULL比较,当无约束时可正常运行,但是当约束为Struct时,编译错误;未约束为引用时,对两个变量的比较为非法;不可将+,-*应用于非约束泛型类型上.
    • <T>类型参数(占位符);<int>类型实参.
    • 开放类型:含有<T>的;封闭类型:每个参数都是<int>的.只能构造封闭类型的instance.
    • ArrayList由于会产生装箱/拆箱操作,所以性能不如List<T>.
    • 类型推断
      • 在调用泛型方法时,自动判断所使用的类型.
      • 依据是变量的Type,而非引用的Type.所以是一种编译时行为.
    • 协变/逆变
      • 协变:子类到父类;逆变:父类到子类.
      • 仅泛型接口和委托支持,泛型类和方法不支持.
      • 原则:若一个几口需要对T支持协/逆变,则该接口所有的方法参数必须支持对T的协/逆变.
  • 迭代器
    • foreach可以用于任何实现了IEnumerator GetEnumerator()方法的类上,而不必非要实现IEnumerable接口.
    •   public IEnumerator<int> GetEnumerator()
      {
      int[] list = new int[]{,,};
      foreach (int i in list)
      yield return i;
      }

      GetEnumerator

    • yeild return 语句会使得Complier隐式生成一个实现了IEnumerable接口的内部类.
    • foreach的调用流程:GetEnumerator()->MoveNext()->return .Current.
    • 迭代器是延迟加载的,到in语句时才会调用.
  • If (o is Employee){Employee e = (Employee)o}两次转换;Employee e = o as Employee; If(e ! Null )一次,而且永不抛出异常.
  • Static常量直接嵌入IL内,无内存及地址,仅可为值类型(创建Type对象时创建,在类被夹在到AppDomain时创建).字段基于引用,ReadOnly(不可变的引用,而非不可变的对象)只可在构造器内为可写,其余只可读.不支持常量方法/参数.
  • 值类型[],New时会创建Obejct=0;引用类型[],New会创建引用,而无实际的元素对象.
  • 消息队列(MSMQ)
    • OS通信的基础(NT,2000以上),用于创建分布式,松散连接通信APP这些APP可通过不同种类的网络通信,亦可脱机.向断开连接的队列发送信息和有连接时一样.
    • 用户队列:公用MSMQ:在所有网络上复制传输,可被所有站点访问;专用MSMQ:仅在锁驻留的本地PC上可用(只能当知道完整Path或检查的APP访问),管理MSMQ:指定希望队列组件使用的管理的.响应MSMQ:目标APP接到消息返回给发送APP的相应信息.
    • 系统队列:日记:可选地存储,发送消息副本和删除信息;死信:存放无法传递或已过期的消息副本;专用系统:一系列系统执行处理操作所需的管理和通知消息的专用MSMQ.
    • 用途:1)数据库通过发送Message来操作数据(节省:对数据库连接请求数据的事件,从数据库返回数据的事件),当客户端不需要知道数据库操作结果时;2)ERP:断开连接时保存信息,连接恢复时发送消息,当队列驻留的PC无法工作,或者路由所需域控制器无法工作时消息无法投递,MSMQ可使消息暂存.
    • 由于消息传输时占用大量的带宽.所以应该尽量少使用.
  • 序列化
    • 可以利用序列化技术创建对象的深拷贝.
    • 必须保证序列化/反序列化时使用相同的formatter.
    • 可以将多个对象序列化到一个Stream中,然后以相同的顺序从Stream中反序列化出各个对象.
    • 序列化一个对象时,Type的全名和Assembly名会写入流中.
    • 反序列化时,使用Assembly.load方法加载Assembly.
    • 枚举和委托类型总是可序列化的.
    • 父类可序列化,子类必须显示声明才可以被序列化.
      • 子类为可序列化,而父类不可,那么结果亦是不可.
      • Object类是可序列化的.
      • 序列化会读取一个对象的所有字段(包括private).
      • 如果类型含有敏感信息,应该设置为不可序列化的.
    • [NoSerialized]标识不被序列化的属性.
    • [Seralizable]标识的属性不应使用自动属性,因为其名称不定.
  • JSON
    • 从结构上看,Data可分解为3个部分

      • Scalar标量.一个单独的字符串或者数字.
      • Sequence序列.有序的若干相关数据并在一起,即数组.
      • Mapping映射.名/值对.又称字典.
    • JOSN定义.
      • 逗号,并列的数据.
      • 冒号:映射.
      • 方括号[].并列数据的集合(数据).
      • 大括号{}.映射的集合(对象).

.Net的基础概念的更多相关文章

  1. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  3. Jmeter基础之---jmeter基础概念

    Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...

  4. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

  5. 理解 angular2 基础概念和结构 ----angular2系列(二)

    前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...

  6. JavaBean 基础概念、使用实例及代码分析

    JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...

  7. RabbitMQ基础概念详细介绍

    http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...

  8. linux设备驱动归纳总结(二):模块的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...

  9. linux设备驱动归纳总结(一)内核的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...

  10. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

随机推荐

  1. Android图片适配,drawable文件夹,低分辨率图片是否必要

    我们知道,Android提供了几种不同分辨率的bitmap,来对应不同手机屏幕的密度.对应关系如下: xxhdpi:3.0 xhdpi: 2.0 hdpi: 1.5 mdpi: 1.0 ldpi: 0 ...

  2. .net 调用C++类库

    事实上这一直是个非常无解的问题.最好的办法是将C++类库写成COM. 可是有时候往往不能这个做.那就仅仅有两种办法:转成C函数形式或者Manage C++封装. 下文就介绍了这两种方法. 原帖:htt ...

  3. 在Android上使用ZXing识别条形码/二维码

    越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等. 本文使用ZXing 1.6实现条码 ...

  4. QWT6.0.1+win7下安装说明

    A) 简介 1.QWT是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或 ...

  5. nodejs配置与入门

    Node.js 笔记(一) nodejs.npm.express安装 http://blog.csdn.net/haidaochen/article/details/7257655 Windows平台 ...

  6. Squish License

    https://www.froglogic.com/squish/gui-testing/prices-and-licensing/index.php Prices and Licensing Who ...

  7. Nginx的一些基本功能极速入门

    本文主要介绍一些Nginx的最基本功能以及简单配置,但不包括Nginx的安装部署以及实现原理. 1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片 ...

  8. IIS 之 HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面...)

    错误如下图所示: 其实在IIS7中肯定能支持的的,只是我们在Win7中安装IIS7的时候没有勾选这些功能,具体方法如下: 1.依次打开" 控制面板→程序→程序和功能→打开或关闭Windwos ...

  9. js(jQuery)获取时间的方法及常用时间类搜集

    获取时间的方法及常用时间类都是大家经常使用的,在本文为大家整理了一些,个人感觉还比较全,感兴趣的朋友可以收集下   复制代码代码如下: $(function(){ var mydate = new D ...

  10. sort() 方法用于对数组的元素进行排序

    语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...