您的位置:首页 > 其它

微软MSDN论坛技术支持工程师准备题目

2009-09-08 21:35 369 查看
Mr. Peng Our JD is as below I suggest you’d better do some preparation for the knowledge as below: Any question, please let me know. Thank you for your attention. ? .NET, C#, OO ? different between event and delegate 委托你可以在客户代码中直接调用委托来激发委托指向的函数 事件不可以,事件的触发只能由服务代码自己触发 事件是特殊类型的委托,只可以从声明它们的类中调用 委托不仅可直接+,-,也可用+=、-=来处理,事件只能用+=,-=注册方法 ? GAC的理解及其作用. GAC全称是Global Assembly Cache 作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:/WINDOWS/Microsoft.NET/Framework/vX下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。 除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly: 1)创建一个strong-name的Assembly,例如ToolbarComponent.dll 2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC 3)在程序中动态装载: System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f"); MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache); 在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil -l"查到。 另外,上面提到了GAC中的Assembly必须是strong-name的。创建strong-name的Assembly的步骤大致如下: a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。 b) 在VS.NET里面 ? 可以被问的比较的深入applicatiionState, SessionState ViewState 是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 )。由于隐藏窗体字段是发送到客户端的页面的一部分,所以 ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。 回传后,ASP.NET 页面框架将解析 ViewState 字符串,并为该页面和各个控件填充 ViewState 属性。然后,控件再使用 ViewState 数据将自己重新恢复为以前的状态。 DataTable dt = new DataTable(); dt = DbAcc.QueryDs(strSql).Tables[0]; //用于分页和排序 ViewState["UserList"] = dt; 因WEB窗体与窗体之间不存在关联   要靠状态管理来实现   Appliction:网站第一次运行创建,全站所有页面可访问 Session: 当用户登陆时创建,全站所有页面可访问,但用户下线后消失 ViewState:当前面面可访问,处理客户端,跳转到别的页面不可见 ? new与virtual method的区别 注意new操作符与new修饰符的区别:new操作符用来创建对象实例(调用构造函数,在堆中开辟空间并初始化,将其引用返回;如果不使用new,如classA A;那么A只是在栈上的一个标记,并没有实际内容);new修饰符用以显式隐藏基类中的成员(包括属性,方法,成员,嵌套类等)(不写new也可对基类成员实现隐藏,但会出现警告信息)。 可以使用完全限定基类名访问基类中的隐藏成员。 1. virtual:当一个方法为是方法,在调用该方法时,会监测此时的运行时类型可以通过查看,然后调用运行时类型上的重写方法。在调用方法时,产生指令,该指令在被编译成汇编语言时,产生三条汇编指令可以在命令窗口中输入来查看编译后的代码: mov ecx,esi; //将目标对象的引用(在这里是this)存储在IA-32 ecx寄存器中; mov eax,dword ptr[ecx];//针对虚方法调用的指令将对象的类型句柄存储在寄存器中 call dword ptr [eax+offset];通过对象的类型句柄和方法在方法表中的偏移量来定位目标方法的实际地址; 而对于非方法,在调用该方法时,产生指令,该指令在被编译成会被语言时,只产生两条汇编指令相比而言,指令不需在运行时检测对象的运行时类型: mov ecx,esi;//把目标对象的引用放进ecx寄存器 call methodAddress;//直接调用methodAddress指向的目标方法 2. new:子类在继承了父类后,可以用new来隐藏父类中的方法。此时,在子类的方法表(Mathod Table)中,仍然保留父类中该方法的方法槽(slot,.net对象模型中,类型中的每个方法在方法表中都占用一个方法槽)。因此,我们仍然可以将子类的引用强制转换成父类的引用,来调用父类中的非virtual或virtual方法。例如:下面第四题中的代码,如果我们将override改成new,则最终结果是:执行父类Base的Method1,输出“In Base's Method1()”。 3. override:子类在继承了父类后,可以用override来重写父类中的方法。此时,在子类的方法表中,不再保留父类中该方法的方法槽。当我们将子类的引用强制转换成父类的引用,来试图调用父类中的virtual方法时,实际上是不能执行成功的,因为CLR检测到此时对象的运行时类型是子类类型,于是将调用分派(dispatch)到子类的方法上。例如:下面第四题中的代码,在父类Base中调用子类中已重写的Method1方法,CLR检测到此时this的运行时类型为Derived,因此仍然会调用Derived中重写的Method1。 ? 正确实现Idipose/IDisposable和机构 此接口的主要用途是释放非托管资源。当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。但无法预测进行垃圾回收的时间。 另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。将此接口的Dispose方法与垃圾回收器一起使用来显式释放非托管资源。 当不再需要对象时,对象的使用者可以调用此方法。 使用CLR垃圾收集器,您不必再担心如何管理对托管堆分配的内存,不过您仍需清理其他类型的资源。托管类通过 IDisposable 接口使其使用方可以在垃圾收集器终结对象前释放可能很重要的资源。通过遵循 disposable 模式并且留 意需注意的问题,类可以确保其所有资源得以正确清理,并且在直接通过 Dispose 调用或通过终结器线程运行清理代码时 不会发生任何问题。 ? 新的c#语言feature(如Lamda) I/ 自动属性 II/ 局部变量类型 III/ 对象初始化和集合初始化 IV/ 匿名类型 V/ Lambda表达式 VI/ 扩展方法 VII/ 查询语法 ? ASP.NET:中Handle和Application关系/JavaScript闭包 JavaScript Closure 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 ? Equality,interface与virtual functions, reflectiion Equality:如果两个对象是相同的类型,并且它们各自带有相同和等值的属性。 Interface:接口定义了一组方法,没有方法体,可以实现多继承。 Virtual functions:虚函数,通过基类访问派生类定义的函数.派生类重写基类的函数定义 reflectiion:反射,提供了封装程序集、模块和类型的对象。 ? How to add a cookie/application? this.Page.Application.Add(string names,object ValueType); 如何建立Cookie:ASP.NET建立Cookie的标准代码写法是 HttpCookie myCookie = new HttpCookie("someCookie"); 这句代码建立了一个名为myCookie的Cookie对象 2. 接收Cookie对象:接收ASP.NETCookie对象的标准代码写法是 HttpCookie getCookie = Request.Cookies["someCookie"]; 设置getCookie为一个Cookie对象,它是请求页面中Cookie对象数组中someCookie的子集。如果名为someCookie的Cookie数组不存在,则getCookie的null属性为true。 3. 给Cookie增加键值:ASP.NET增加键值的标准代码写法是 myCookie.Values.Add("auth", "admin"); 给名为myCookie的Cookie对象(必须实现建好)增加一个auth键名,其值为admin。 4. 附加键值,使Cookie生效:标准代码格式为 Response.Cookies.Add(myCookie); 上句代码把名为myCookie的对象附加到Cookie数组内。注意,在设定Cookie完毕之后一定要加上这句代码才能生效, 4. 设定生存期:设置生存期的标准代码形式如下 myCookie.Expires = DateTime.Now.AddDays(3); 设定名为myCookie的Cookie对象生存期为当前时间加上3天。需要注意的是,设定Cookie之后如果页面不刷新,是不会显示任何效果的。 5. 获取Cookie的值:获取Cookie值的标准代码格式为 myCookie.Values["auth"]; 上句代码可以获取名为myCookie的Cookie对象键名为auth的键值。如果不存在,则返回null ? 静态全局变量和普通全局变量的区别 单个源文件有效Vs多个源文件有效 非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它. ? 抽象类和接口的区别. 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 二、接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性: 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。 小结: 类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类 而接口只是一个行为的规范或规定, 抽象类更多的是定义在一系列紧密相关的类间, 而接口大多数是关系疏松但都实现某一功能的类中 ? .NET Generic的理解. 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework, 类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化 例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类, 而不致引入运行时强制转换装箱操作的成本或风险.泛型类最常用于集合,如链接、堆栈、队列、树等, 其中,像从集合中添加和移除项这样的操作都以大体上相同的方式执行存储数据的类型无关 ? Const/read-only 1. const 字段只能在该字段的声明中初始化。 readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。 2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。 3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。 4.const 对于引用类型的常数,可能的值只能是 string、值类型和 null 。 readonly可以是任何类型 需要注意的一个问题是: 对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。 小结: 声明中初始化Vs构造函数中初始化 编译时常数Vs运行时常数 默认静态Vs显示声明静态 有限值Vs任何型值 面向对象(封装,多态,继承概念的理解.) 一 、面向过程与面向对象的区别: 前者是一种谓语和宾语的关系;后者是一种主语和谓语的关系 。 二、面向对象的三个特征: ??封装 ??继承 ??多态 三、类与对象: 对象又称作实例,是实际存在的该类事物的每个个体。类是对某一类事物的描述,是抽象的、概念上的 定义。 *面向对象的设计的重点是类的设计。 四、对象的比较: 1 “= =”运算符与equals()方法的区别: 前者辨别实质是否相等;后者辨别长相是否相等。 五、 实现类的封装性: 1不能让外面的类随意修改一个类的成员变量;2在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法 调用,而不能被其他的类中的方法所调用; 3为实现封装性,常将类的成员变量 声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有 读取和赋值操作,我们一般定义两个方法来实现这两种操作,即:getXxx()与setXxx(); 4一个类就是一个模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容。再进行程序设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。 六、构造函数的定义与作用: 1、 特征:??名称与类相同;??不含返回值;??不能在方法中用return返回一个值注意:构造方法里不含返回值的概念是不同与void的,在定义构造方法时加了void,结果这个方法就不再被自动调用了。 2作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用, 我们可以在这个方法中加入要完成初始化工作的代码。 七、若类中已定义了一个构造方法,编译器就不再自动产生类似public Person(){ }的构造方法。 八、this引用句柄的应用: 1、 类的成员名和对其进行赋值的成员方法的形参变量同名时,使用this便于理解; 2、 假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。 3、 构造方法是在产生对象时被java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。不是用构造方法名,而是用this的形式,根据其中的参数列表,选择相应的构造方法。 九 、 垃圾回收过程分析:java中的finalize()方法;System.gc的作用。 Finalize()的调用是在无用对象被回收前发生的。 一○、 static 静态方法:1、 在静态方法中只能直接调用同类中其他的静态成员,而不能直接访问类中的非静态成员。原因是对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象;2、 静态方法不能以任何方式引用this和super关键字;3、 main()方法是静态的,因此,JVM在执行main方法时不创建main方法所在的类的实例对象,因此在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。 一一、 JVM在程序执行时,只有在调 讲讲你对的理解 .NET Framework 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发。.NET Framework 旨在实现下列目标: ?提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。 ?提供一个将软件部署和版本控制冲突最小化的代码执行环境。 ?提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境。 ?提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。 ?使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。 ?按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。 =============== 上面来自于.NET Framework文档 成员初始化顺序值类型引用类型异常处理同步等 成员初始化顺序,值类型/引用类型,异常处理,同步等. 先是成员变量,再是成员方法。 值类型/引用类型:类C中的(传)值和(传)地址 异常处理:try{}catch(Exception e){}finally{} 同步:线程同步,类Java ASP页面的执行顺序 客户发出POST请求-〉创建Page派生类,调用构造函数-〉调用Page类的IHttpHandler.ProcessRequest方法-〉 激活Page类的Init事件-〉调用Page类的CreateChildControls虚方法-〉从POST变量和VIEWSTATE中还原服务器端控件状态-〉 激活Page类的Load事件-〉激活服务器端控件事件-〉激活Page类的PreRender事件-〉调用Page类的Render虚方法-〉 调用Page类的RenderChildren虚方法-〉发送HTTP响应给客户端-〉激活Page类的Unload事件-〉丢弃Page派生类的实例。 阶段 页面事件 可重定义的方法 页面初始化 Init 视图状态加载 LoadViewState 回传数据处理 控件里实现了IPostBackDataHandler接口的LoadPostData方法 页面加载 Load 回传数据变化检查 控件里实现了IPostBackDataHandler接口的RaisePostDataChangedEvent方法 回传事件处理 控件里定义的回传事件 控件里实现了IPostBackEventHandler接口的RaisePostBackEvent方法 页面预返回阶段 PreRender 页面返回阶段 Render 页面卸载阶段 Unload net framework的程式、架构 三层体系结构 1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务. 2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。 3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx, 如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。 应用程序域 MFC消息机制 1.标准消息 除WM_COMMAND之外,所有以WM_开头的消息。 从CWnd派生的类,都可以接收到这类消息。 2.命令消息 来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。 CCmdTarget派生的类,都可以接收到这类消息。 3.通告消息 由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。 从CCmdTarget派生的类,都可以接收到这类消息。 Timer属性 Enabled用于表示是否tick事件 Interval用于指定间隔时间 Tick 指定间隔到期后执行 控件和组件的区别 控件一般是为了完成特定的展示或特定页面/窗体的技术功能,而组件一般指对一些小功能点的封装,封装后的集合(组件)一般具有较独立的功能,可以完成某一项任务 所以控件是为了页面/窗体级复用项目级复用 组件更抽象,更通用。我们可以把软件划分为一个个组件,但很少有人说把软件划分为一个个控件。 也可以理解为控件是一种特殊的组件。继承于Controls 当Tax box有多个按钮,提交按钮通知时,服务器如何分辨 隐藏域/关于Event Validation 隐藏域是客户端看不见的,它可以用于提交表单的判断,接收页面用一个页面处理多个form的提交. Event Validation:这个特性会对 PostBack 的值进行验证 ASP.NET 2.0 增加了一个新特性: Event Validation. 这个特性会对 PostBack 的值进行验证,确保是合法的值。 其实现原理是在页面 Render 的时候,ASP.NET 引擎会对控件的可能的值以及控件的 UniqueID 进行 hash 计算,得到一个值。 页面里所有需要回发的控件的这些计算值就组成了一个列表,组合后放在隐藏字段 __EVENTVALIDATION 中。 在页面回发后,会对这个字段的内容进行解包,然后重新计算对比 hash 值是否一致。这个做法的好处是能够防止一些模拟的 post 攻击, 但也有一个不方便的地方,就是有时候如果需要用 javascript 修改页面里的一些内容,则回发后不会被当作合法的数据,而抛出一个异常。 另外,如果页面非常大或者网速缓慢,用户在还没有下载到 __EVENTVALIDATION 这个字段的时候就点下 submit,导致回发数据不完整,也会导致异常的发生。 解决这个问题的办法是在 Page 的 Directive 里面禁用 EventValidation,目前还没有针对单独控件进行禁用的办法。 重载类的重写 基类里把重载的每个函数都声明成virtual虚方法,并用public访问修饰符 继承类里用同样的签名,加入override,原重载的方法都全部重写一遍,就是重载类的重写. ASP.NET的页面传值过程./ 界面传值的几种方式 页面传值可通过表单提交、链接地址传送、 Response.Redirect()方式、Server.Transfer()方式。 Session共享、Application共享、Cookie、 AJAX的相关问题 AJAX,是一种创建交互式网页应用的网页开发技术。它使用:使用XHTML+CSS来表示信息; 使用Javascript操作Document Object Model进行动态显示及交互; 使用 XML 和 XSLT 进行数据交换及相关操作; 使用 XMLHttpRequest对象与Web服务器进行异步数据交换; C++ public/private的定义 public 公共,加上这个修饰的类或属性,可以在同一个包或者别的包 private 私有的,加上这个修饰的类或属性,只能在同类里访问 property 和attribute 的区别 property是指类向外提供的数据区域。 attribute是描述对象在编译时或运行时固有型用户自定义型用户自定义型利用Reflection运行期 TEXTBOX限制数字的方式 TextBox 的KeyPress属性中限制该控件只能输入数字 ? SQL ? Winform的DataGridView和database 1、DataGridView是database的显示形式。 2、database是DataGridView显示形式的数据来源 3、两者通过dataAdapter实现数据的填充与通讯 ? 连接数据库. SQL, 对表的理解对表的主键外键的理解视图为什么要有视图视图有什么功能视图与表有什么区别使用过其他数据库吗与其他数据库的不同点在哪 表:同一类实体或关系记录的集合 主键:记录的在该集合(表)中的唯一标识 外键:其它集合(表)对非本表的标识的引用 视图:物理集合(表)的一种特殊表现形式 视图作用:物理集合(表)的一种特殊表现形式,可真对同一个或相关几个物理集合定制多中视图。 用过:MySql,Orcal等均不支持top语句,令外稳定和吞吐率也有差异。 having, count语句 select meshid,point_x,point_y from Point group by meshid,point_x,point_y having count 将分组出来的记录进行计算,如果存在记录内容相同的,也就是同样的记录存在大于一条以上的显示出来. 利用语句过滤分组数据 select distinct 职业,count(*) as 职业人数,max(工资) as 最高工资,avg(工资) as 平均工资 from kj group by 职业 having avg(工资)>1900 (1)省略了,查询结果中不会消除重复的记录.也可以指定ALL关键字来明确指示要保留重复记录,但这是不必要的,因为是默认的行为. (2)DISTINCT并不是指某一行,而是指不重复SELECT输出的所有列.这一点十分重要,其作用是防止相同的行出现在一个查询结果的输出中. (3)DISTINCT是SUM/AVG和COUNT函数的可选关键字.如果使用DISTINCT关键字,那么在计算总和\平均值或计数之前,先消除重复的值. 2.将HAVING语句应用在多表查询中:select kj.职业,max(kj.年龄) as 最高年龄,sum(du.收入) as 合计收入 from kjbdsjk as kj inner join duobiao as du on kj.编号 = du.编号 group by 职业 having sum(收入)>10000 3.利用聚集函数SUM对销售额进行汇总:select 书号,书名,sum(单价*销售数量) as 金额 from xiaoshoubiao group by 书号,书名 4.利用聚集函数AVG求某班学生的平均年龄:select avg(年龄) as 平均年龄 from kj 5.利用聚集函数COUNT求日销售额大于某值的商品数:select count(all 日期) as 商品数 from daojubiao where 销售额 > 1500 ADO.NET的理解 ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、处理和更新所包含的数据。 ADO.NET 通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET Framework 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet 对象也可以独立于 .NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。 小节: ADO.NET包括两个组成部分 2.(数据集)表示数据在客户机内存中的缓存。 1.数据提供者也称为数据提供程序,实际上就是建立和数据库的连接、提取数据、操作数据、执行数据命令等一系列类。 存储过程什么是存储过程,索引,临时表,触发器等等 存储过程(stored procedure)是一组为了完成特定功能的sql 语句集,经编译后存储在数据库。 在sql server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理sql server 提供支持。通过系统存储过程,ms sql server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。 好处: 1) 存储过程允许标准组件式编程 2) 存储过程能够实现较快的执行速度 3) 存储过程能够减少网络流量 4) 存储过程可被作为一种安全机制来充分利用 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是SQL语句和可选控制流语句的预编译集合 ,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。 索引用来快速地寻找那些具有特定值的记录,表里面的记录数量越多,这个操作的代价就越高,无需扫描任何记录即可迅速得到目标记录所在的位置。 临时表,临时表用来保存事务或会话期间的中间结果,创建后对任何用户都是可见的。 触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时, 触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的SQL语句。 Inner left和的区别 如表A AID OtherA 1 2 2 3 表B BID OtherB 2 3 3 4 Inner left和right join的区别. Inner join : Select * from A Inner join B on A.AID=B.BID 求A,B中AID=BID链接链接集合 AID OtherA BID OtherB 2 3 2 3 Left Join : Select * from A Left join B on A.ID=B.ID 求A,B中AID=BID链接链接集合,加A中 和B不匹配的集合,A中照旧存在,B的字段以空填。 AID OtherA BID OtherB 1 2 Null Null 2 3 2 3 Right Join : Select * from A Rright join B on A.AID=B.BID 求A,B中AID=BID链接链接集合,加B中 和A不匹配的集合,B中照旧存在,A的字段以空填。 AID OtherA BID OtherB 2 3 2 3 Null Null 3 4 left join(左联接) 左表中的所有记录 right join(右联接) 右表中的所有记录 inner join(等值连接) 只返回两个表中联结字段相等的行 Override与的区别 override 表示重写,用于继承类对基类中虚成员的实现 overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现 override译作覆盖,用于继承一个基类时,对基类的非虚方法的重新实现,如果是虚方法,则是多态。两者完全不同。 对于使用基类型指针或是引用来调用方法,如果是覆盖,其调用关系在编译期间就已经确定, 而对于多态,则是后期联编,在运行时根据动态类型来确定。 overload表示重载,用于同一类中同名方法但参数个数或类型不同的实现,也就是让方法有不同签名的版本。 ? 数据结构 ? 数据结构: hash table问题,数组与链表中间结点问题,多线程遍历文件夹, 范式的概念 对数据结构单链表的理解树数据结构的理解 单链表: 链接方式存储的线性表简称为链表(Linked List)。  链表的具体存储表示为:   ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)   ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 树: 树型数据结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。它描述了客观世界中事物之间的层次关系,树在计算机领域内也有广泛的应用,如在编译程序中,可用树表示源程序的语法结构。在数据库系统中的文件索引机构一般采用树来表示。 单链表的倒置方法 从头节点开始以此将节点的指向倒转,最后返回原链表的尾节点也就是倒转后链表的头节点. 链表删除结点的用法 链表删除结点的用法: 如有链表 A B C 三节点 要删B A->next=B->next; 要删除 A list.Header=B; 要删除C B->next=NULL; 如果是双向链表要稍微复杂一点。 在链表中删除一个结点,最常规的做法是从链表的头结点开始,顺序查找要删除的结点,找到之后再删除。 由于需要顺序查找,时间复杂度自然就是O(n) 了。 ? Web技术 ? HTTP module/HTTP handler HTTP modules are .NET components that implement the System.Web.IHttpModule interface. These components plug themselves into the ASP.NET request processing pipeline by registering themselves for certain events. Whenever those events occur, ASP.NET invokes the interested HTTP modules so that the modules can play with the request. HTTP handlers are the .NET components that implement the System.Web.IHttpHandler interface. Any class that implements the IHttpHandler interface can act as a target for the incoming HTTP requests. HTTP handlers are somewhat similar to ISAPI extensions. One difference between HTTP handlers and ISAPI extensions is that HTTP handlers can be called directly by using their file name in the URL, similar to ISAPI extensions. ? Handler/Module, or how MasterPage works, Handler/Module前面说了,这里不再讲了。 说MasterPage MasterPage其实是一种模板,它可以让你快速的建立相同页面布局而内部不同的网页,如果一个网站有多个MasterPage,那么新建aspx文件的时候就可以选择需要实现页面布局的MasterPage。另外,在你没有使用MasterPage之前,如果N个相同的页面布局需要改动成另外一个样式,那么你就要做很多无聊而又不得不做的工作,对N个页面进行一一更改,如果使用了MasterPage,你只要改动一个页面也就是MasterPage文件就可以了。还有,你是否发现你要要部署的web程序越来越大,使用MasterPage在一定程度上会减小web程序的大小,因为所有的重复的html标记都只有一个版本。 网络的相关信息的理解 TCP/IP(传输控制协议/网际协议)是互联网中的基本通信语言或协议。在私网中,它也被用作通信协议。当你直接网络连接时,你的计算机应提供一个TCP/IP程序的副本,此时接收你所发送的信息的计算机也应有一个TCP/IP程序的副本。从这句话可以看出TCP就是控制传输的协议,IP是网际协议是基于地址解析的。 TCP/IP是一个两层的程序。高层为传输控制协议即TCP的概念,它负责聚集信息或把文件拆分称更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议即IP的概念,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。IP地址都知道他的意思,不用贴上来了。 TCP/IP使用客户端/服务器模式进行通信。TCP/IP通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。TCP/IP与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才是每个人都可以连续不断的使用网络。   许多用户熟悉使用TCP/IP协议的高层应用协议。包括万维网的超文本传输协议(HTTP),文件传输协议(FTP),Telnet和简单邮件传输协议(SMTP)。这些协议通常和TCP/IP协议打包在一起。   使用模拟电话调制解调器连接网络的个人电脑通常是使用串行线路接口协议(SLIP)和点对点协议(PPP)。这些协议压缩IP包后通过拨号电话线发送到对方的调制解调器中。   有TCP/IP协议相关的协议还包括用户数据报协议(UDP),它代替TCP/IP协议来达到特殊的目的。其他协议是网络主机用来交换路由信息的,包括Internet控制信息协议(ICMP),内部网关协议(IGP),外部网关协议(EGP),边界网关协议(BGP)。 TCP/IP是一个两层的程序。高层为传输控制协议即TCP的概念,它负责聚集信息或把文件拆分称更小的包。 这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议即IP的概念, 它处理每个包的地址部分,使这些包正确的到达目的地。 Session的存储机制 基于cookie存储的session机制 基于db存储的session机制 1.asp.net中客户端的存储。 asp.net中,默认是使用存储的,如果是将改成, 则session就不用cookie来存储了,而是使用url来存储。 2.asp.net服务器端session存储在进程内(inproc) 当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的好处就是性能提高。 3.asp.net服务器端Session存储在进程外(StateServer) 当mode="StateServer"时,服务器的Session就存储在"ASP.NET State Server"这个服务的进程中,在服务中找到名为:“ASP.NET State Service”的服务,启动这个服务,在资源管理器的进程中就能找到一个名为:“aspnet_state.exe"的进程,这个就是我们保存 Session的进程。 ”ASP.NET State Server"服务可以与Web服务器分开.eg:web服务器在192.168.0.100上,“asp.net state service"服务在192.168.0.101上,则可以进行设置: mode="StateServer" stateConnection="tcpip=192.168.1.101:42424". 4.asp.net服务器端存储到中 当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在 %windir%/Microsoft.NET/Framework/v2.0.50727 下有个名为的脚本文件 这个脚本是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的. 执行此脚本后,会看到一个新增的数据库,但这个数据库中,只有存储过程,没有用户表, 用户表放到了tempdb这个数据库中去了,ASpstateTempSessions和ASPStateTempApplications, Session信息存储到了ASPStateTempApplication存储了asp中Application对象信息。 另外查看管理代理作业,会发现多了一个名为:   ASPState_job_DeleteExpiredSession的作业,这个作业实际上是每分钟去ASPStateTempSession中删除过期的Session信息。 mode:Session的存储方式必有的属性。 InProc:将存到进程内这是值。,就是说进程打开,开始起作用 off:禁用Session. StateServer:将Session存到独立的状态服务中(Asp.net State Service). SqlServer:将存到中。 当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的好处就是性能提高。 Cookie/session 1. Session用来保存每一个用户的专有信息 2. Session的生存期是用户持续请求时间加上一段时间(一般是20分钟左右) 3. Session信息是保存在Web服务器内存中的,保存数据量可大可小 4. Session超时或者被关闭将自动释放数据信息 5. 由于用户停止使用应用程序之后它仍在内存中存留一段时间,因此这种方法效率较低 6. 代码:Session[“UserID”]=”test”; String UserName=Session[“UserID”].ToString(); Cookie 1. Cookie用来保存客户浏览器请求服务器页面的请求信息 2. 我们可以存放非敏感的用户信息,保存时间可以根据需要设置 3. 如果没有设置Cookie失效日期,它的生命周期保存到关闭浏览器为止 4. Cookie对象的Expires属性设置为MinValue表示永不过期 5. Cookie存储的数据量受限制,大多数的浏览器为4K因此不要存放大数据 6. 由于并非所有的浏览器都支持Cookie,数据将以明文的形式保存在客户端 7. 代码:Resopnse.Cookies[“UserID”]=”test”; String UserName= Resopnse.Cookies [“UserID”].ToString(); ? WINDOWS 操作系统 ? How to create a thread? 创建线程是通过创建新的Thread对象来实现的。Thread类的构造函数需要一个ThreadStart委托或ParameterizedThreadStart委托作为参数。 ThreadStart委托和ParameterizedThreadStart委托表示在Thread上执行的方法。它们的定义如下: public delegate void ThreadStart (); public delegate void ParameterizedThreadStart (Object obj); 其中的参数obj包含该线程过程的数据对象。 在调用Thread对象的Start()方法之前,该线程不会开始执行。Start方法立即返回,经常是在实际启动新线程之前返回。新的线程将从ThreadStart或ParameterizedThreadStart委托表示的方法的第一行开始执行。只能调用一次Start()方法,多次调用将引发ThreadStateException异常。 线程启动后可以使用ThreadState和IsAlive属性来确定任何时刻的线程状态,但是绝不应该将这些属性用于同步线程的活动 Thread InstanceCaller = new Thread(new ThreadStart(serverObject.InstanceMethod)); //线程声明 InstanceCaller.Start();//线程启动 2、匿名方法创建线程: Thread thread1 = new Thread(delegate()) { Console.WriteLine("进入子线程1"); for (int i = 1; i < 4; ++i) { Thread.Sleep(50); Console.WriteLine("/t+++++++子线程1+++++++++"); } Console.WriteLine("退出子线程1"); }); thread1.Start(); 3、声明线程+函数 Thread _hThread; _hThread = new Thread(ThreadCallBack); public void ThreadCallBack() { // Do Something } ? How to create a process? 要使用C#达到您的目的,你可以使用System.Diagnostics namespace下的Process对象。下面是一个例子: p = new System.Diagnostics.Process(); // Handle the Exited event fired by the Process class this.p.Exited += new System.EventHandler(this.p_Exited); //p_Exited是你的Event处理函数 p.EnableRaisingEvents = true; p.SynchronizingObject = this; p.StartInfo.FileName = "notepad.exe"; p.Start(); 实例化一个对象时,堆和栈的分配情况 堆主要用来存放对象的,栈主要是用来执行程序的 object o=new object(); 分配一个对象指针在栈里,分配一个新对象在堆里,并将栈里的指针指向堆里的对象 服务器缓存在存在什么地方的? 服务器内存里 new操作符创建对象实例,调用构造函数,堆中开辟空间并初始化,将其引用返回 虚拟内存如何实现? 任何一个进程都被赋予其自己的虚拟地址空间,该虚拟地址空间覆盖了一个相当大的范围,对于32位进程,其地址空间为232=4,294,967,296 Byte,这使得一个指针可以使用从0x00000000到0xFFFFFFFF的4GB范围之内的任何一个值。虽然每一个32位进程可使用4GB的地址空间,但并不意味着每一个进程实际拥有4GB的物理地址空间,该地址空间仅仅是一个虚拟地址空间,此虚拟地址空间只是内存地址的一个范围。进程实际可以得到的物理内存要远小于其虚拟地址空间。进程的虚拟地址空间是为每个进程所私有的,在进程内运行的线程对内存空间的访问都被限制在调用进程之内,而不能访问属于其他进程的内存空间。这样,在不同的进程中可以使用相同地址的指针来指向属于各自调用进程的内容而不会由此引起混乱。 Windows内存寻址 Windows认证和form验证 Job Title: MSDN Forum Support Engineer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: