原文地址:http://www.cnblogs.com/powertoolsteam/p/what-net-developer-should-to-know.html 葡萄城控件javascript
做为一个.NET程序员,应该知道的不只仅是拖拽一个控件到设计时窗口中。就像一个赛车手,必定要了解他的爱车 – 能作什么不能作什么。html
本文参考Scott Hanselman给出的.NET问题列表,整理以下。包括WinForms,ASP.NET,XML以及C#和.NET基础相关的问题,有兴趣的自我检测一下吧~java
参考答案另附在文章末尾,因为水平有限,不免有谬误,欢迎指正。node
这里问的是强名称概念。Assembly.Load("foo.dll")加载程序集的方法是否正确?程序员
public class c{ public c(string a) : this() {;}; public c() {;} } 这个构造函数有用吗?web
· 什么叫做ViewState?是什么编码?加密了吗?究竟是谁在使用ViewState?编程
------------------------------------------------------------------------------------------------------------------------浏览器
------------------------------------------------------------------------------------------------------------------------缓存
一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。安全
这个解释很形象:连接
Windows服务能够在计算机启动时自动启动,能够暂停和从新启动并且不显示任何用户界面。
EXE 可执行程序一般有一个用户界面,Console或 GUI,一般由用户来启动或中止。
以32位操做系统为例,最大寻址是4G(含虚拟内存),是经过2的32次方计算的; 当物理内存小于4G时,进程访问的内存量随着虚拟内存的增长而增长,直到4G; 4GB内存实际上包含了程序的全部部分--包括可执行代码,代码加载的全部dll,以及程序运行时使用的全部变量的内容。这个4GB内存称为虚拟地址空间,或虚拟内存。
对设计有明显影响的有2点:
在.NET中区别最明显的是int的使用,在32位下和64位下存储的数据不同(int 4个字节32位, 8个字节64位);另一个是编译的程序为X86则可在3二、64位下同时运行。
DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。EXE就不用说了吧~
强类型是指尽可能早的检查变量的类型, 一般在编译的时候就检查.
弱类型是指尽可能推后对变量类型的检查, 一般在运行时检查。
到底哪一个好? 其实各有各的好, 像ruby, javascript, 都属于week-typing, 好处是写代码的时候比较快. C#属于strong-typing, 好处是若是变量类型不对的话, 编译不会经过, Visual Studio 还会有提示. 至于写代码的速度上讲, 自从C# 3.0以来, 使用var来定义变量, 简单了不少。
PID全称是 Process Identifier, 就是进程的一个号码, 一般当系统哪一个程序不听使唤的时候, 能够用它来把这个程序关闭. 并且Debug的时候, 也有用。
TCP/IP端口能够被多少个进程分享
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket1.Bind(new IPEndPoint(IPAddress.Parse(”127.0.0.1″),8235)); socket1.Listen(10); socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); socket2.Bind(new IPEndPoint(IPAddress.Parse(”127.0.0.1″), 8235)); socket2.Listen(10); Console.Read();
GAC 是指 Global Assembly Cache, 用处是放在这里的程序集能够被多个程序共同调用, .NET 中的大部分程序集都在这里. 解决的问题是节省硬盘空间以及防止Dll Hell。
面向接口:定义要实现某类功能应该遵循的统一规范,而具体实现过程由实现该接口的类型决定。
面向对象:强调对具备相同行为和属性事物的封装,更注重封装的完整性和功能的完整性。
面向方面:主要提供与业务逻辑无关的操做。好比系统中有多个地方都用到文件上传功能,可使用面向方面的思想在全部上传文件以前对文件的大小、格式等信息进行过滤操做,而不是在每处上传代码里面完成对这些信息的过滤。
接口(Interface): 不能实列化,本身没有状态,方法也没有具体的实现,被继承时,继承类须要实现接口的全部方法。接口就像租房时网上下载的一个租房合同模板。
类 (Class): 能够被实例化,有状态,被继承时,继承类也不须要从新实现被继承类中的方法。可是若是被继承类的方法中有abstract修饰的,继承类则须要实现这个方法。类像是已经被填上内容的租房合同的模板。
代码在运行过程当中动态获取程序集的信息,对象的信息,或者直接调用对象的方法或属性。 e.g. var i = 100; i.GetType(); 输出System.Int32。
XML Web service: 是开放标准,使用Http/SOAP协议交互。
.NET Remoting: 是微软本身的技术,只能在.NET里面使用。
early-binding: 是指编译的时候绑定,late-binding是指运行时绑定。
动态引用。
Assembly.LoadFile只载入相应的dll文件,其余文件并不会被载入。
Assembly.LoadFrom会载入dll文件及其引用的其余dll
这里问的是强名称概念。
它不是一个文件名,相比文件名,Assembly Qualified Name更能肯定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。由于一样一个名称的文件可能有不一样的版本和区域,此时单独靠文件名称,可能会形成不能肯定程序集的正确性。
不对,正确方式为:Assembly.Load("foo, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3")
经过签发具备强签名的程序集合,能够确保名称的全局惟一性!由于强名称是依赖于惟一的密钥对来确保名称的惟一性,其余人不会生成与你相同的程序集名称(不一样的私钥产生的名称不一样)。强名称保护程序集的版本沿袭,由于强名称的惟一性可以确保没有其余人可以生成你的程序集的后续版本。强名称提供可靠的完整性检查,经过.NET Framework安全检查后,能够确保程序集内容在生成后未被更改过!
DateTime 不能为null。由于其为Struct,属于值类型,值类型不能为null,只有引用类型才能被赋值null。
JIT(Just In Time),这是咱们经过.NET编译器生成的应用程序最终面向机器的编译器
本机映像生成器 (Ngen) 是一种提升托管应用程序性能的工具。 Ngen.exe 建立本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行时可从缓存中使用本机映像,而没必要使用实时 (JIT) 编译器编译原始程序集。
因为 JIT 编译器会在调用程序集中定义的单个方法时将该程序集的 MSIL 转换为本机代码,于是一定会对运行时的性能形成影响。在大多数状况下,这种性能影响是能够接受的。更为重要的是,由 JIT 编译器生成的代码会绑定到触发编译的进程上。它没法在多个进程之间进行共享。为了能在多个应用程序调用或共享一组程序集的多个进程之间共享生成的代码,公共语言运行库支持一种提早编译模式。此提早编译模式使用本机映像生成器 (Ngen.exe) 将 MSIL 程序集转换为本机代码,其做用与 JIT 编译器极为类似。可是,Ngen.exe 的操做与 JIT 编译器的操做有三点不一样:
· 它在应用程序运行以前而不是运行过程当中执行从 MSIL 到本机代码的转换。
· 它一次编译一个完整的程序集,而不是一次编译一个方法。
· 它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。
.NET的垃圾回收分为3代,可经过GC.Collect强制处理。
一个对象实例没有被任何地方引用时就称为垃圾,当内存不够是GC就会将该对象实例占用的空间清理出来
Finalize只释放非托管资源;
Dispose释放托管和非托管资源
Finalize和Dispose共享相同的资源释放策略,所以他们之间也是没有冲突的。
有用,限定资源做用域并自动释放。
IDisposable是一个接口,有一个方法Dispose(),能够在对象出做用域的时候调用,如在Using出界后调用这个接口。
列出全部使用符合引号内pattern的dll的进程.
In-proc 发生在一个进程以内, Out-of-proc 发生在不一样进程之间。
Xp : aspnet_Wp.exe
Windows 2000 : inetinfo.exe
Windows 2003 : w3wp.exe
通常使用DateTime.TryParse解析。
PDBs是源码编译文件-全称Program Database,这个文件主要会存储对应模块(dll或者exe)内部的全部符号,以及符号对应的地址、文件名和行号。调试的时候应用程序和源文件之间的一个桥梁。
一种代码复杂度的衡量标准。
能够用来衡量一个模块断定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖全部的可能状况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的潜在风险和高的圈复杂度有着很大关系。
lock 关键字可确保当一个线程位于代码的临界区时,另外一个线程不会进入该临界区。 若是其余线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
public class MySingleton { private static object myLock = new object(); private static volatile MySingleton mySingleton = null; private MySingleton() { } public static MySingleton GetInstance() { if (mySingleton == null) { //第一次检查 lock (myLock) { if (mySingleton == null) { // 第二次检查 mySingleton = new MySingleton(); } } } return mySingleton; } }
FullTrust即为彻底信任,也称为盲目信任.
GAC:有FullTrust权限
更加灵活的设置对代码的访问权限,实现代码级保护,防止被移动代码恶意利用
全局程序集缓存中若是有Corillian就更新该程序集,没有就安装。
显示程序集的公钥标记。
因DCOM的端口号是随机分配的,默认状况下,会分配1024以上的端口号,因此默认状况下,DCOM不能穿越防火墙。
135是远程过程调用(RPC)的默认端口
OOP是一种编程模型,将复杂的逻辑分解出小的模块,特性是继承,封装和多态。而SOA是一个技术框架。 SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,固然其组件化思想是继承和发扬了OOP的优势。
XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少须要ACL权限中的读权限。
由于try-catch有性能损失,在性能要求高的场景下,频繁使用效果不好。同时,catch(Exception)后,可能会破坏程序的正常执行逻辑,致使阅读、调试代码难度增大。
Catch的时候应该捕捉具体的Exception类型,而不是通用的Exception
Debug只在debug状态下会输出,Trace在release下也会输出,在release下Debug的内容会消失。Debug会产生pdb文件,release不会。
Debug和Release编译产出物不同,Release下无调试信息,如Assert没法使用。对程序运行速度而言,无明显区别。建议在开发环境下用Debug编译,发布环境下用Release,为了使用Assert断言。
方法,因对于一次运行,极可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用。
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,能够有部分实现,但一个类能实现多个接口,但只能继承一个基类。接口是是一种契约,定义了继承它的类必须声明接口中的方法。
区别:
接口只有方法、属性、事件和索引符;类除了这四种成员以外还能够别的成员(如字段)。接口没有构造函数,类有构造函数。
接口不能进行运算符的重载,类能够进行运算符重载。
接口的成员没有任何修饰符,其成员老是公共的,而类的成员则能够有修饰符。派生于接口的类必须实现接口中全部成员的执行方式,而从类派生的则否则。
equals:比较两个变量的内容是否相等
==:操做比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
对象一致指的是引用相同。对象相等指的是内容相等。
深复制将会在新对象中建立引用类型字段引用的全部对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。
ICloneable 接口能够提供建立现有对象中复制的自定义实现。
拆箱就是引用类型转换为值类型,一般伴随着从堆中复制对象实例的操做
装箱就是值类型数据转换为Object类型的引用对象
引用类型
把不参与序列化的对象标注出来,只序列化有用的数据,而不是序列化整个对象。去除不必的数据冗余,和提高序列化时的性能。
之因此说out参数很差,是由于经过out参数传值,间接了破坏了封装性和函数的可读性。但笔者认为有的时候仍是很实用很方便的。
能够。至少比较省事。
/// <summary>The EnableWindow Function.</summary> [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnableWindow(System.IntPtr hWnd, [MarshalAs(UnmanagedType.Bool)]bool enable);
override new在基类没有virtual关键字的状况下必须使用。反作用是破坏了继承关系。
virtual:virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们能够在派生类中被重写。例如,此方法可被任何继承它的类重写。
sealed:当对一个类应用 sealed 修饰符时,此修饰符会阻止其余类从该类继承。
override:要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
abstract:abstract 修饰符能够和类、方法、属性、索引器及事件一块儿使用。在类声明中使用 abstract 修饰符以指示某个类只能是其余类的基类。标记为抽象或包含在抽象类中的成员必须经过从抽象类派生的类来实现。
Foo.Bar: 程序集名称
Version=2.0.205.0: 程序集版本
Culture=neutral: 区域
PublicKeyToken: 程序集public密钥
public: 对任何类和成员都公开, 无限制访问;
protected: 仅仅对该类以及该类的派生类公开;
private: 仅仅对该类公开;
internal: 只能值包含该类的程序集中访问该类(只是单独的项目,而不是整个解决方案)
主互操做程序集(PIA)指的是官方发布的互操做程序集,若是电脑中安装了PIA,当你添加对类库的引用时,那么Visual Studio会自动加载PIA,微软为Office应用程序提供了PIA,如EXcel PIA就是Microsof.Office.Interop.Excel.dll,其余应用程序也相似。详见:http://msdn.microsoft.com/zh-cn/library/aax7sdch(v=vs.110).aspx
.NET 反射,为测试方法加了Attribute
throw e; //CLR认为这里是异常的起始点
throw; //CLR不会从新设置异常的起始点
Typeof()是运算符而GetType是方法
GetType()是基类System.Object的方法,所以只有创建一个实例以后才可以被调用(初始化之后)
Typeof()的参数只能是int,string,String,自定义类型,且不能是实例
public class c{ public c(string a) : this() {;}; public c() {;} } 这个构造函数有用吗?
先调用了this(),即无参构造函数,再调用了自身的有参的构造函数。
由于未对a参数进行处理,故无用。
This 用于调用当前实例,没法在 static 方法中调用 this。
aspx
<form method=”post” action=”test.aspx”>
<input name=”Button1” type=”submit” />
</form> Cs protected void Page_Load(object sender, EventArgs e) { if (Request["Button1"] != null) { //Button1_OnClick Function Code } }
页面数据从客户端经过Form的Post方法传输到服务器端的过程叫作PostBack。
· 什么叫做ViewState?是什么编码?加密了吗?究竟是谁在使用ViewState?
保存服务器控件在PostBack时状态不变的技术叫作ViewState。这些状态信息被保存在前台的hidden元素中。默认为Base64编码,默认不会ViewState被加密。在页面中全部开启了ViewState的服务器控件会使用到它。 参考
Machinekey是添加在web.config中<system></system>之间的一个标签。它保证cookies、viewstate加密解密时的数据不会被篡改。参考
Process:优势:进程内。速度比较快,但比较难适应大型应用。
ASP.NET State Service: ASP.NET状态服务。速度,容量上折中。若是使用专用的状态服务器则能够扩展。
SQL Server Session State Management: 速度较慢。但可靠性是最强的。并且也有很高的扩展性,适合大型应用。
当使用线程池中的线程进行异步请求操做时,多个请求间的线程是可以重用的。每一个HttpRequest都有本身的线程。当线程重用时,应该使用Thread Local存储。
检查ContentType便可。更安全的作法是解析HttpHandler。
用户输入URL,路由将该次请求转到DNS服务器,DNS服务器将请求转向URL所指向的服务器IP,若是IIS中某个站点包含所请求主机头信息,则请求成功。
服务器在告诉客户端,须要将须要一些服务器必要信息存成cookies保存在客户端中,而每次客户端访问服务器时会将cookies中的信息经过请求发送给服务器。滥用的例子好比:Cookies中保存敏感信息,用户密码。
验证用户输入的全部内容,保证服务器的安全性和健壮性。
Header共包括通用头、请求消息、响应消息及消息实体等数据。
Get方法为URL传值,POST为Form表单传值。
200 访问成功、301 永久重定向、302暂时重定向、304服务器已缓存、404访问资源不存在、500服务器出错、504 网关超时。
if-not-modified-since及 last-modified是保存在Request http header中的两个信息,客户端在访问资源时,对比两个信息,就能肯定须要读取缓存文件仍是更新本地缓存文件。Response.Content.Headers
Explain <@OutputCache%> and the usage of VaryByParam, VaryByHeader.
VaryByCustom,咱们能够自定义输出缓存要求的任意文本。除了在OutputCache指令里面申明该属性以外,咱们还得在应用程序的 global.asax 文件的代码声明块中,重写GetVaryByCustomString 方法来为自定义字符串指定输出缓存的行为。
Eg:
<%@ OutputCache VaryByParam="none" VaryByCustom="CategoryPageKey" Location="server" Duration="43200" %>
这里的VaryByCustom定义的为CategoryPageKey,那么在global.asax里面咱们必须定义CategoryPageKey这个字符创输出缓存的行为,见下面代码。
public override string GetVaryByCustomString(HttpContext context, String arg) { … }
提供避免元素命名冲突的方法
DOM是一种与浏览器,平台,语言无关的接口,使你能够访问页面其余的标准组件。 DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准方法,让他们来访问他们站点中的数据、脚本和表现层对像。
DOM尺寸不受限制。
它由一组非专有的 Web 服务规范以及对这些旨在促进互操做性的规范的说明和修正组成
为相关Web服务更好的一块儿互操做的使用提供了实现的指导方针
<?xml version="1.0" encoding="UTF-8"?> <note> <to>a</to> <from>b</from> </note>
数据自己应当存储在元素中,而有关数据的信息(元数据)应当存储在属性
属性不能很好地保持原文的结构
元素容许包括元元数据(有关信息的更深层次的信息)。
每一个人对元数据和非元数据的理解是不同的。
面对之后的变化,元素更具扩展性。
对于很是简单而且不随文档改变其形式的信息,使用属性较好。特别是样式信息和连接信息,做为属性执行起来很顺利
格式无缺的XML不是有效的xml
不只要格式无缺并且还要遵循必定的顺序规则
格式无缺的(well-formed)XML文档包括:起始标签和结束标签应当匹配,结束标签是必不可少的;大小写应一致:XML对字母的大小写是敏感的,和是彻底不一样的两个标签,因此结束标签在匹配时必定要注意大小写一致;元素应当正确嵌套:子元素应当彻底包括在父辈元素中。
有效的(valid)XML文档是指一个遵照XML语法规则,并遵照相应DTD文件规范的XML文档。
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventCallBack); settings.ValidationType = ValidationType.Schema; settings.Schemas serch= schemaSet;
这个会递归搜索所有的Document节点,一般消耗会比较大。除非真的须要检索全部叫mynode的节点,那就比较好。
XmlReader 是一个只进、只读的游标。 它提供了对输入的快速和非缓存的流式访问。 它能够读取流或文档。 它使用户能够提取数据,并跳过对应用程序没有意义的记录。 较大的差别在于 SAX 模型是一个“推送”模型,其中分析器将事件推到应用程序,在每次读取新节点时通知应用程序,而使用 XmlReader 的应用程序能够随意从读取器提取节点。
XPathDocument 类读取 XML 文档-在内存中的快速只读表示形式
可编辑的 XmlDocument 类读取 XML 文档
XML片断一般不是一个彻底符合标准的XML文档,可能没有根节点,好比:“<foo></foo><bar></bar>”。XML文档一般有一个根节点和一些由标记组成的内容。好比:“<root><foo></foo><bar></bar></root>”
规范化形式的XML是XML规范的一个子集。任何XML文档均可以转换为规范化形式的XML,所以将特定类型的微小差别去除却还是该XML文档。
XML InfoSet是W3C规范,用于描述一组数据集的抽象数据模型。XML DOM是InfoSet的一个实例。
DTD经过合法元素和属性列表定义XML文档的文档结构。XSD描述XML文档的文档结构。
支持。设置XmlReaderSettings.DtdProcessing属性为DtdProcessing.Parse。设置XmlReaderSettings.ValidationType属性为ValidationType.DTD。