.Net基础
标题 | 状态 | 内容 | ||||||||||||||||||||||||||
NET应用程序是如何执行的? |
http://www.cnblogs.com/kingmoon/archive/2012/07/16/2594459.html |
|||||||||||||||||||||||||||
从汇编入手,探究泛型的性能问题 |
||||||||||||||||||||||||||||
汇编及IL |
从这里我们可以看到,CLR为引用类型(string/object/Program)生成共享的机器码,它们都实际上在调用一个GenericMethod<System.__Canon>所生成的代码。而对于每个不同的值类型(int/DateTime/double),CLR则会为每种类型各生成一份 http://www.cnblogs.com/JeffreyZhao/archive/2009/06/03/my-view-of-il-2-il-shows-little-about-clr.html |
|||||||||||||||||||||||||||
JIT | JIT Compiler(Just-in-time Compiler) 即时编译 | |||||||||||||||||||||||||||
。NET和C#各个版本的变迁 | 已读 |
CLR是公共语言运行库(Common Language Runtime) http://www.cnblogs.com/lufangtao/archive/2012/06/07/2539915.html CLR 完全介绍 深入探讨 IDisposable https://msdn.microsoft.com/zh-cn/magazine/cc163392.aspx
Net 版本和C#对应关系 .Net各版本差别 参考 http://blog.csdn.net/xjc1278003262/article/details/8605738?utm_source=tuicool
C#各版本差别
|
||||||||||||||||||||||||||
HttpContext请求上下文对象 | ||||||||||||||||||||||||||||
值类型和引用类型的区别 |
http://www.cnblogs.com/Autumoon/archive/2008/08/18/1270685.html 所有值类型都继承自System.ValueType,但是ValueType没有附加System.Object包含之外其它任何方法,不过它倒是改写了Equals和GetHashCode两个方法。引用类型变量的Equals比较的是二者的引用地址而不是内部的值,值类型变量的Equals方法比较的是二者的值而不是……哦对了,值类型压根儿没有引用地址; |
|||||||||||||||||||||||||||
c# ==和equals的区别 |
http://kb.cnblogs.com/page/206353/ http://stackoverflow.com/questions/21273890/what-is-the-difference-between-and-equals-for-primitives-in-c 对于值类型 对于不同的类型会强制转换成前面的类型。如果如short -》int 行 int=》short 不行 对于引用类型 ==比较的是引用地址是否相同(即栈中的内容是否相同),equal比较的是2个变量师傅是对同一个对象的引用,即堆中的内容是否相同。 值类型 类型不同的时候会调用不同的equal Equals和GetHashcode http://blog.csdn.net/afgasdg/article/details/6889383 http://www.cnblogs.com/lwzz/archive/2012/02/26/2361843.html ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。 C#参考 :ReferenceEquals, == , Equals http://www.cnblogs.com/Dlonghow/archive/2008/08/04/1259732.html 默认情况下,对于引用类型,该方法对比的时引用的地址,对于值类型,对比的是值的二进制描述是否相同。100.0与100虽然都是100,但是它们的二进制分布是不一样的。 1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。 2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。 1、equals方法用于比较对象的内容是否相等(覆盖以后) 2、hashcode方法只有在集合中用到 3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。 4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。 5、将元素放入集合的流程图: |
|||||||||||||||||||||||||||
内存分配 |
http://www.cnblogs.com/aaa6818162/p/4644505.html 从内存分配看函数参数传递问题 http://blog.csdn.net/fmoonstar/article/details/6827030变量、参数和内存分配 http://www.cnblogs.com/IOS-Developer/p/4117618.html 对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 |
|||||||||||||||||||||||||||
字符串的驻留(String Interning) |
http://www.cnblogs.com/artech/archive/2007/03/04/663728.aspx 于String是我们做到频率最高的一种类型,CLR考虑性能的提升和内存节约上,对于相同的字符串,一般不会为他们分别分配内存块,相反地,他们会共享一块内存。CLR实际上采用这个的机制来实现的:CLR内部维护着一块特殊的数据结构——我们可以把它看成是一个Hash table,这个Hash table维护者大部分创建的string(我这里没有说全部,因为有特例)。这个Hash table的Key对应的相应的string本身,而Value则是分配给这个string的内存块的引用。当CLR初始化的时候创建这个Hash table。一般地,在程序运行过程中,如果需要的创建一个string,CLR会根据这个string的Hash Code试着在Hash table中找这个相同的string,如果找到,则直接把找到的string的地址赋给相应的变量,如果没有则在托管堆中创建一个string,CLR会先在managed heap中创建该strng,并在Hash table中创建一个Key-Value Pair——Key为这个string本身,Value位这个新创建的string的内存地址,这个地址最重被赋给响应的变量 深入理解string和如何高效地使用string http://www.cnblogs.com/artech/archive/2007/05/06/737130.html |
|||||||||||||||||||||||||||
C#中,String和string的区别 |
C#中,字符串的声明,你使用String还是string? 也可以这样理解:string是C#中字符串类型String的反射,一种简化的书写方式,就像int对应于Int32一样,二者在C#中可通用。 |
|||||||||||||||||||||||||||
String,StringBuffer,StringBuilder |
http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来 执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。 而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。 一个特殊的例子: 1 String str = “This is only a” + “ simple” + “ test”; 对于三者使用的总结: 1.如果要操作少量的数据用 = String 2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder 3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer |
|||||||||||||||||||||||||||
参数的类型 | 实参和形参:形参就是函数定义时候用的,实参是在函数调用时候用的。
1. 比如你定义一个函数void add(int a, int b),这里的a和b就是形参。 2. 当你进行函数调用的时候,add(1, 2),这里的1和2就是实参。 |
|||||||||||||||||||||||||||
变量和参数 | http://www.cnblogs.com/lanxiazhi/archive/2009/03/19/1417161.html
局部变量是指在函数型成员如方法、属性、索引器中声明的变量 声明时指定了static修饰符的字段就是静态变量 C#中一共有四种类型的参数:值参数,引用参数,输出参数,参数数组。 |
|||||||||||||||||||||||||||
C# const, readonly, static readonly | http://www.cnblogs.com/qingxia/archive/2011/02/10/1950741.html
Const 定义的是静态常在对象初始化的时候赋值.以后不能改变它的值.属于编译时常量。不能用new初始化。 Readonly 是只读变量.属于运行时变量.可以在类constructor里改变它的值.不能作用于局部变量。 const 和 static 不能在一起用,它已经是静态的了。 我们都知道,const和static readonly的确非常像:通过类名而不是对象名进行访问,在程式中只读等等。在多数情况下能混用。 而static readonly,在程式中只读, 不过它是在运行时计算出其值的,所以还能通过静态构造函数来对它赋值, readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员 |
|||||||||||||||||||||||||||
委托 事件
什么是委托? 委托和事件的关系? |
http://www.cnblogs.com/chengzish/p/4559268.html
http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 委托 是存放方法的指针的清单,也就是装方法的容器 事件是委托对象,事件自身实现了对委托对象的保护 所以event关键字本质就是做了两个事情,从而实现对委托对象的保护: 1,创建了一个对应的Private委托对象 2,然后添加Add和Remove方法访问、操作这个Private委托对象。
Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时, 其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。 <SPAN style="FONT-SIZE: 13px">using System; |
|||||||||||||||||||||||||||
多线程 static 单例 |
线程上下文切换的性能损耗测试 http://www.cnblogs.com/EthanCai/p/3705834.html
static 在多线程的情况 Static与线程安全 http://yinlei555.iteye.com/blog/707986静态方法是否有线程安全问题?要看在静态方法中是否使用了静态成员。 对于ASP.NET, 多个客户端访问服务器端, 这是一个多线程的例子 c#创建带参数的线程 、无参数线程的创建 http://www.cnblogs.com/aaa6818162/p/4516940.html /// <summary> |
|||||||||||||||||||||||||||
Dispose(); .Clear(); = null | DataTable的 .Dispose(); .Clear(); = null; 三个有何区别,?http://zhidao.baidu.com/link?url=HE1FqLFeui856OhD7i3n4aKEicDJh42GaRm0EuLGvJC9xPIwQCmWM99D_iEmv3d035-8Td8hcIcJD-qIgXnz8_ | |||||||||||||||||||||||||||
深拷贝浅拷贝 | ICloneable
浅拷贝就比如像引用类型,而深拷贝就比如值类型。 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了, 可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人, 叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。 |
|||||||||||||||||||||||||||
Lambda表达式详解 |
http://www.cnblogs.com/aaa6818162/p/4677140.html //传入参数类型 |
|||||||||||||||||||||||||||
c#扩展方法 | ||||||||||||||||||||||||||||
async and await 简单的入门 |
http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html http://blog.csdn.net/tianmuxia/article/details/17675681 http://www.cnblogs.com/jesse2013/p/async-and-await.html 线程的创建是比较占用资源的一件事情,.NET 为我们提供了线程池来帮助我们创建和管理线程。Task是默认会直接使用线程池,但是Thread不会。如果我们不使用Task,又想用线程池的话,可以使用ThreadPool类。 await并不是针对于async的方法,而是针对async方法所返回给我们的Task,这也是为什么所有的async方法都必须返回给我们Task。所以我们同样可以在Task前面也加上await关键字,这样做实际上是告诉编译器我需要等这个Task的返回值或者等这个Task执行完毕之后才能继续往下走。 |
|||||||||||||||||||||||||||
迭代器 |
http://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html foreach编译来调用GetEnumerator和MoveNext方法以及Current属性 http://dotnet.9sssd.com/csbase/art/794 考虑这样一种情况。假设数组是靠链表实现的(实际上是线性表,但是我们这里假设)。 |
|||||||||||||||||||||||||||
for和foreach |
http://m.blog.csdn.net/blog/sansan52048/9159941 在foreach循环中,迭代集合collectionObject的过程如下: foreach是取只读的,在取的时候数据队列不能变(包括修改,删除,添加等)。要避免这个问题,就应该使用for循环。 IList<Person> iList = new List<Person>(); iList.Add( new Person("david",)); |
|||||||||||||||||||||||||||
状态机 | http://www.cnblogs.com/TianFang/archive/2007/12/27/1017665.html | |||||||||||||||||||||||||||
线程静态字段 System.ThreadStaticAttribute |
http://www.cnblogs.com/SkylineSoft/articles/1726232.html ThreadStaticAttribute 的作用是告诉CLR,它标记的静态字段的存取是依赖当前线程,而独立于其他线程的。 例如: class MyClass{ MyClass 中的threadvalue就是一个线程静态字段 。 如果一个程序中同时有多个线程同时访问这个字段,则每个线程访问的都是独立的threadvalue 。例如线程1设置它为”hello”,然后线程2设置它为”world”,最后线程1读取它的时候,得到的是”hello”。 基于这个,线程静态字段有以下特征:
但是,使用线程静态字段要注意:
如果你知道 System.Runtime.Remoting.Messaging.Context (以下简称MContext)
|
|||||||||||||||||||||||||||
List<T>传值 |
[__DynamicallyInvokable] [TestMethod] |
|||||||||||||||||||||||||||
终结器 | http://blog.csdn.net/fxqcn/article/details/6717426 | |||||||||||||||||||||||||||
托管代码和非托管代码 |
http://www.cnblogs.com/muzhiye/archive/2012/02/23/2365556.html net托管代码是运行在.NET FRAMEWORK上的,类似于JAVA虚拟机 托管代码:属安全代码,因为不涉及指针,但相对性能上较低,C#写出来的东西就可以认为是托管代码 非托管代码:非安全的,可以使用指针,性能较高,C++那是写出来的东西就可以认为是非托管代码,还有比如MFC等等 一般地,项目开发用托管代码即可。 简单来说: |
|||||||||||||||||||||||||||
C#编译器 JIT编译器 |
从C#的源代码到机器代码,中间要经过两个编译器。一个就是把C#源代码编译成托管模块的C#编译器。另一个就是作为CLR一个组件的JIT编译器。每经过一次编译,程序的语言就更低级一步。 C#编译器生成的是IL语言和元数据 C#编译器是用来生成包含IL和元数据的模块的,一旦编译完成,东西基本就是定下来了的。而JIT编译器会根据元数据和情况来做一些改变。比如泛型中的类型参数的填入和生成相应的机器代码,都是JIT编译器做的,而不是C#编译器。C#编译器的工作就是生成相应的IL和元数据告诉JIT这是一个泛型类型,有类型实参。编译好的程序集,放在那里不动,程序集里的IL和元数据当然不会发生变化。而同一个程序集,在不同CLR版本中的行为和性能就有可能不同,也是一样的道理。 |
|||||||||||||||||||||||||||
CLR VIA | http://www.cnblogs.com/janes/category/308324.html | |||||||||||||||||||||||||||
.Net 托管模块与程序集的关系 |
http://blog.csdn.net/kmguo/article/details/17055065 | |||||||||||||||||||||||||||
.NET概念:.NET程序编译和运行 |
http://blog.csdn.net/yysyangyangyangshan/article/details/7306346 |
|||||||||||||||||||||||||||
浅谈.NET中泛型的基本原理 |
http://www.cnblogs.com/DebugLZQ/archive/2012/09/03/2669383.html |
|||||||||||||||||||||||||||
NET PDB文件到底是什么? |
http://www.cnblogs.com/imjustice/archive/2013/06/07/note_about_dot_net_pdb_file.html 这个文件会在我们调试的时候被使用到,这个东西可以理解为调试的时候应用程序和源文件之间的一个桥梁。正是归功于这个文件,我们才能在debug的时候看到程序当前执行相对应的代码和监视到一些变量 主要远程调试可以用 |
|||||||||||||||||||||||||||
汇编 | ||||||||||||||||||||||||||||
类型参数 |
尖括号中的T是不确定的数据类型,叫做类型参数,一般规定以字母T开头,可以是TKey, TValue都可以。而调用时指定的具体类型叫做类型实参。 |
|||||||||||||||||||||||||||
开放类型与封闭类型 |
开放类型:具有泛型参数的类型是开放类型,如List<T>,CLR不允许构造开放类型的实例; 封闭类型:在实际调用代码时,如果所有类型实参都已经指定了实际数据类型,如List<string>,则该类型为封闭类型。CLR允许构造封闭类型的实例。 |
|||||||||||||||||||||||||||
正确实现 IDisposable 接口 |
http://www.cnblogs.com/xlshcn/archive/2007/01/16/idisposable.html 在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。 Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。 |
|||||||||||||||||||||||||||
C# 托管资源和非托管资源 |
那么对于非托管的资源,这里再重申一下,就是Stream,数据库的连接,GDI+的相关对象,还有Com对象等等这些资源 最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container, Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。 |
|||||||||||||||||||||||||||
.Net基础的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- C#的惰性枚举
Ruby 2.0有一个新的特性是惰性枚举器,Soi Mort 的博客举了一个例子:可以将下面的代码 File.open(path) {|fp| fp.each_line. \ select {|lin ...
- 开发笔记:用不用UnitOfWork以及Repository返回什么集合类型
这2天实际开发中明确的东西,在这篇博文中记录一下. 之前对是否需要自己封装UnitOfWork有些犹豫,因为Entity Framework就是一个UnitOfWork实现, 自己再封装一下显得有些多 ...
- 怎么实现元素ol的降序排序显示
首先介绍一下什么是ol元素.这里直接引用MDN里面的定义:The HTML <ol> Element (or HTML Ordered List Element) represents a ...
- Kali Linux Web 渗透测试视频教程—第十课 w3af
Kali Linux Web 渗透测试视频教程—第十课 w3af 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/24/kali-linux-web- ...
- Navicat for MySQL的服务器连接管理
Navicat for MySQL可以导入导出数据库服务器的连接,方便你换机器时不用再设置连接. 导出为一个.ncx的XML文件. 导入后,在执行一个查询时,可能会报以下错误 这是因为源机器和本 ...
- [游戏学习26] MFC 时间函数 画图形
>_<:这里第一次介绍MFC的时间函数,功能和Win32里的计时器类似. >_<:这里还介绍了MFC的图形绘制函数,和Win32有一点区别 >_<:ABC.h #d ...
- 最新 Windows 10 应用项目模板发布
以下是最新的Visual Studio 2015 Windows 10 应用程序模板. Windows 10中几乎所有的官方应用都遵循这样一个设计模板:在左上方有一个所谓的导航栏.点击该导航按钮,左侧 ...
- YUI Compressor for Sublime text2
YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发. 最近压缩文件,常使用在线压缩的方式来压缩文件,一来多有不便,二来如果没有网络,只能搁置了.本文来描述如何 ...
- 如何启动/停止/重启MySQL
启动.停止.重启 MySQL 是每个拥有独立主机的站长必须要撑握的操作,下面为大家简单介绍一下操作方法: 一.启动方式 1.使用 service 启动:service mysqld start 2.使 ...
- paip.取当天记录的方法sql跟hql hibernate
paip.取当天记录的方法sql跟hql hibernate #------两个方法...函数法和日期计算法.. 函数法: DATEDIFF(d,createTime,GETDATE())=0 / ...