C#知识点梳理补充LYCS

OOP:面向对象编程。面向过程可以理解成工厂里的流水线,封装的方式是按数据处理的流程。而面向对象更像是对工人的描述。将工人的工作方式封装成一个个的函数,然后让程序进行调用。

OOD:面向对象设计。

OOA:面向对象分析。

低耦合:简单理解,一个完整的系统,模块与模块之间,尽可能的使其独立存在。让每一个模块尽可能独立完成某个特定的子功能。

面向对象的好处:

(1)降低耦合。每个功能分装成相应的类,降低功能之间代码上联系。

2封装

封装的优点:

(1)即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员

(2)设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据。这样就可以达到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断。

(3)封装还可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,形成一个封闭的空间,然后可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。一个类中包含敏感数据,有些人可以访问,有些人不能访问,如果不对这些数据的访问加以限制,后果将会非常严重。所以要对类的成员使用不同的访问修饰符,从而定义他们的访问级别。

(4)通过修改访问修饰符实现

Public数据类型变量名{get{return变量名}//获取数据set{变量名=value;}//设置数据}使用封装还可以实现对属性的只读、只写:publicstringName{get;privateset;}//只读publicstringName{privateget;set;}//只写这样写属性时,编译器会自动创建privatestringname。这种是会自动实现后备成员变量的自动实现属性。如果是:publicstringName{get;set;}这样的没有啥限定的属性,其实和公有字段没多大区别了。3继承

继承是面向对象最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不支持多继承,即在C#一次只允许继承一个类,不能同时继承多个类。

Publicclass类名:父类名如何使用父类里面的成员变量,方法,构造函数?

关键字:base

成员变量:base.成员变量名

方法:base.方法名

4多态

多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。

4.1静态多态性:在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C#提供了两种技术来实现静态多态性。

(2)运算符重载:可以重定义或重载C#中内置的运算符

4.2动态多态性:当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。

4.2.1虚方法(virtual)

(2)虚方法可以在不同的继承类中有不同的实现。

(3)对虚方法的调用是在运行时发生的。

(4)动态多态性是通过抽象类和虚方法实现的。

4.2.2接口(Interface)

虚方法:virtual虚方法存在于相对于需要实现多态的子类的父类当中,同时也是实现多态的最基本的方法。具体语法:父类的方法,用virtual修饰,表示虚方法。继承它的子类,在内部用override进行重写。下面进行案例分析:

抽象方法和抽象类的关键字都是:abstract如果父类的方法很抽象,而且没有具体的do(做什么)即方法体,必须要子类进行重写才有实际意义的话,这种情况就需要用抽象方法了。父类、子类及输出:

重写父类的方法(子类中):访问修饰符override返回的数据类型void方法名(){//执行代码}

1、重载(overload):在同一个作用域(一般指一个类)的两个或多个方法函数名相同,参数列表不同的方法叫做重载,它们有三个特点(俗称两必须一可以):方法名必须相同参数列表必须不相同返回值类型可以不相同

2、重写(override):子类中为满足自己的需要来重复定义某个方法的不同实现,需要用override关键字,被重写的方法必须是虚方法,用的是virtual关键字。它的特点是(三个相同):相同的方法名、相同的参数列表、相同的返回值

2、虚方法:即为基类中定义的允许在派生类中重写的方法,使用virtual关键字定义。如:

3.抽象方法:在基类中定义的并且必须在派生类中重写的方法,使用abstract关键字定义。如:注意:抽象方法只能在抽象类中定义,如果不在抽象类中定义,则会报出如下错误:··················1、值类型与引用类型值类型:struct、enum、int、float、char、bool、decimal什么是值类型:进一步研究文档,你会发现所有的结构都是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的。根据定义所知,所有的值类型都必须从System.ValueType派生,所有的枚举都从System.Enum抽象类派生,而后者又从System.ValueType派生。所有的值类型都是隐式密封的(sealed),目的是防止其他任何类型从值类型进行派生。基于值类型的变量直接包含值。[2]将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。所有的值类型均隐式派生自SystemValueType。

引用类型:class、delegate、interface、array、object、string在c#中所有的类都是引用类型,包括接口。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自System.Delegate类。

1.1隐式数值转换隐式数值转换包括以下几种:●从sbyte类型到short,int,long,float,double,或decimal类型。●从byte类型到short,ushort,int,uint,long,ulong,float,double,或decimal类型。●从short类型到int,long,float,double,或decimal类型。●从ushort类型到int,uint,long,ulong,float,double,或decimal类型。●从int类型到long,float,double,或decimal类型。●从uint类型到long,ulong,float,double,或decimal类型。●从long类型到float,double,或decimal类型。●从ulong类型到float,double,或decimal类型。●从char类型到ushort,int,uint,long,ulong,float,double,或decimal类型。●从float类型到double类型。其中,从int,uint,或long到float以及从long到double的转换可能会导致精度下降,但决不会引起数量上的丢失。其它的隐式数值转换则不会

为什么要使用集合?数组的局限性:(1)数组元素个数是固定的,数组一但定义,就无法改变元素总数。如果需求变化,则必须修改源码(2)如果初始化元素总数非常大,则会造成空间浪费。集合的特点:(1)根据需要动态增加元素个数,没有限制。(2)可以用以存储多个对象,这是个十分重要的属性。

List泛型集合的特点:(1)表示泛型,T是Type的简写,表示当前不确定具体类型。(2)可以根据用户的实际需要,确定当前集合需要存放的数据类型,一旦确定不可改变。List泛型使用前的准备工作:(1)引入命名空间:System.Collections.Generic(2)确定存储类型:Liststudents=newList();

4堆和栈

5、栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义,通常用于值类型;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小引用类型总是存放在堆中。存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,有系统自动分配和维护;堆是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC清理。使用引用类型的时候,一般是对指针进行的操作而非引用类型对象本身。但是值类型则操作其本身。

4、GC(GarbageCollection)当程序需要更多的堆空间时,GC需要进行垃圾清理工作,暂停所有线程,找出所有无被引用的对象,进行清理,并通知栈中的指针重新指向地址排序后的对象。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手动回收,例如FileStream或SqlConnection需要调用Dispose进行资源的回收。

5、CLR(CommonLanguageRuntime)公共语言运行库,负责资源管理(包括内存分配、程序及加载、异常处理、线程同步、垃圾回收等),并保证应用和底层操作系统的分离。

6、静态构造函数最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数执行顺序:静态变量>静态构造函数>实例变量>实例构造函数7、文件I/O通过流的方式对文件进行读写操作(1)FileStream(2)StreamReader/StreamWriter8、序列化与反序列化序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流。通过序列化,可以执行如下操作:通过Web服务将对象发送到远程应用程序、在域之间传递对象、以XML字符串的形式传递对象通过防火墙、跨应用程序维护安全性或用户专属信息。反序列化:将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。9、线程同步(1)方法一:阻塞(调用Sleep()或Join())(2)方法二:加互斥锁lock

1代码重用,继承类都能用抽象类定义的方法2灵活,某个继承类既可以继承改方法也可以派生一个新的3抽象类是所有继承类通用方法的最小集合,可以封装某一个继承类的实例用来进行传递

11、类class与结构体struct的异同Class属于引用类型,是分配在内存的堆上的;Struct属于值类型,是分配在内存的栈上的;不能从另外一个结构或者类继承,本身也不能被继承;没有默认的构造函数,但是可以添加构造函数;可以不使用new初始化

12、using关键字的使用场景(1)作为指令:用于导入其他命名空间中定义的类型或为命名空间创建别名(2)作为语句:用于定义一个范围,在此范围的末尾将释放对象

14、委托与事件委托可以把一个方法作为参数传入另一个方法,可以理解为指向一个函数的引用;事件是一种特殊的委托。

15、重载(overload)与重写(override)的区别重载:是方法的名称相同,参数或参数类型不同;重载是面向过程的概念。重写:是对基类中的虚方法进行重写。重写是面向对象的概念。

16、return执行顺序try{}里有一个return语句,那么finally{}里的code在return前执行。

通用数据库连接流程第一,使用SqlConnection对象连接数据库;第二,建立SqlCommand对象,负责SQL语句的执行和存储过程的调用;第三,对SQL或存储过程执行后返回的“结果”进行操作。对返回“结果”的操作可以分为两类:一是用SqlDataReader直接一行一行的读取数据集;二是DataSet联合SqlDataAdapter来操作数据库。

常用方法:command.ExecuteNonQuery():返回受影响函数,如增、删、改操作;command.ExecuteScalar():执行查询,返回首行首列的结果;command.ExecuteReader():返回一个数据流(SqlDataReader对象)。

6、DataSet对象6.1SqlDataAdapter;命名空间:System.Data.SqlClient.SqlDataAdapter;SqlDataAdapter是SqlCommand和DataSet之间的桥梁,实例化SqlDataAdapter对象:SqlConnectionsqlCnt=newSqlConnection(connectString);sqlCnt.Open();

//创建SqlCommandSqlCommandmySqlCommand=newSqlCommand();mySqlCommand.CommandType=CommandType.Text;mySqlCommand.CommandText="select*fromproduct";mySqlCommand.Connection=sqlCnt;

6.3DataSet命名空间:System.Data.DataSet。数据集,本地微型数据库,可以存储多张表。使用DataSet第一步就是将SqlDataAdapter返回的数据集(表)填充到Dataset对象中:SqlDataAdaptermyDataAdapter=newSqlDataAdapter("select*fromproduct",sqlCnt);DataSetmyDataSet=newDataSet();//创建DataSetmyDataAdapter.Fill(myDataSet,"product");//将返回的数据集作为“表”填入DataSet中,表名可以与数据库真实的表名不同,并不影响后续的增、删、改等操作①访问DataSet中的数据SqlDataAdaptermyDataAdapter=newSqlDataAdapter("select*fromproduct",sqlCnt);DataSetmyDataSet=newDataSet();myDataAdapter.Fill(myDataSet,"product");

DataTablemyTable=myDataSet.Tables["product"];foreach(DataRowmyRowinmyTable.Rows){foreach(DataColumnmyColumninmyTable.Columns){Console.WriteLine(myRow[myColumn]);//遍历表中的每个单元格}}

stringconnectionString="DataSource=.;InitialCatalog=db_buiness;IntegratedSecurity=True";using(SqlConnectionconn=newSqlConnection(connectionString)){conn.Open();

///publicstaticTMaximun(Tt1,Tt2){try{if(t1.CompareTo(t2)>0){returnt1;}else{returnt2;}}catch(System.Exceptionex){returndefault(T);}}}}d.保存-生成解决方案;e.在Debug文件夹下就会有一个MyTestDll.dll文件,把它放在需要引用的工程;2.调用装的dll文件;a.打开visualstudio-文件-新建-项目-控制台应用程序;b.将MyTestDll.dll文件放在DeBug文件夹下面;c.引用-添加引用-浏览-将MyTestDll.dll添加进来;

d.引用命令空间usingMyTestDll;

主程序代码:staticvoidMain(string[]args){intvar=TestDll.Maximun(1,2);Console.WriteLine("{0}",var);Console.ReadKey();}运行结果:按F2查看封装的TestDll.Maximun方法,如图:

六、其他(了解)1、.NETCore与.NETFramework的区别.NETCore就是.NETFramework的开源且跨平台版本。但微软毕竟不能维护两个不同的分支,一个跑在Windows上,一个跑在Linux(UnixLike)系统上,所以微软抽象出来一个标准库.NETStandardLibrary,.NETCore与.NETFramework都必须实现标准库的API,就这样.NETCore、.NETFramework、Xamarin成了三兄弟,分别为不同的平台服务。

ASP.NETASP.NET是新一代ASP。它与经典ASP是不兼容的,但ASP.NET可能包括经典ASP。ASP.NET页面是经过编译的,这使得它们的运行速度比经典ASP快。ASP.NET具有更好的语言支持,有一大套的用户控件和基于XML的组件,并集成了用户身份验证。ASP.NET页面的扩展名是.aspx,通常是用VB(VisualBasic)或者C#(Csharp)编写。在ASP.NET中的控件可以用不同的语言(包括C++和Java)编写。当浏览器请求ASP.NET文件时,ASP.NET引擎读取文件,编译和执行脚本文件,并将结果以普通的HTML页面返回给浏览器。

WinService、WebService开发

二、字段的使用1.关于字段a.字段又称为:“成员变量”,一般在类的内部做数据交互使用。b.字段命名规范:camel命名法(首单词字母小写)。2.通俗的理解:私有化:字段就好比我们的个人财产,仅供个人使用,所以一般是private修饰。添加标准:根据程序的功能需求,具体来添加需要的不同类型的字段。

四、属性1.属性的使用作用:在面向对象设计中主要使用属性描述对象的静态特征。要求:一般采用Pascal命名法(首字母大写),数据类型要和对应的字段要一致。2.属性的理解a.属性其实就是外界访问私有字段的入口,属性本身不保存任何数据,在对属性赋值和读取的时候其实就是操作的对应私有字段。图例:

b.属性本质其实就是一个方法,通过get和set方法来操作对应的字段,通过反编译工具我们可以看出,如图:

1.你们对于应届毕业生的能力要求一般是多少,是要有完整的项目经历和扎实的基础知识之间,你们会选什么?2.公司的在.net方向的技术栈主要在哪方面,实在winform桌面开发?3.如果工作的话,我会在哪里工作,是在上海?

HtmlHTML是用来描述网页的一种语言。‘HTML标记标签通常被称为HTML标签(HTMLtag)。

层叠样式表(英文全称:CascadingStyleSheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。[1]CSS能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。[2]

JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。

数据库访问效率优化方法:

C#网页端做后台

MVC模式与三层架构的区别转载Fast_Snail最后发布于2017-03-1009:31:09阅读数1076收藏展开之前总是混淆MVC表现模式和三层架构模式,为此记录下。三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层)三层架构(3-tierapplication)通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。MVC是Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。

bll(model)

3、列举ASP.NET页面之间传递值的几种方式。

1.使用QueryString,如....id=1;response.Redirect()....

2.使用Session变量

3.使用Server.Transfer

4.Cookie传值

4、C#中的委托是什么?事件是不是一种委托?事件和委托的关系。

委托可以把一个方法作为参数代入另一个方法。

委托可以理解为指向一个函数的指针。

委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法

面试聊:用Reflector查看.Net的类的内部实现,解决问题。

5、override与重载(overload)的区别

重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。

Override是进行基类中函数的重写。Override是面向对象的概念

6、C#中索引器是否只能根据数字进行索引?是否允许多个索引器参数?

参数的个数和类型都是任意的。加分的补充回答:用reflector反编译可以看出,索引器的内部本质上就是set_item、get_item方法。

基础知识:

索引的语法:

publicstringthis[strings],通过get、set块来定义取值、赋值的逻辑

索引可以有多个参数、参数类型任意

索引可以重载。

如果只有get没有set就是只读的索引。

索引其实就是set_Item、get_Item两个方法。

7、属性和public字段的区别是什么?调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?

属性可以对设值、取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的,极端的例子。PublicAge{get{return100;}set{}}。加分的补充回答:用reflector反编译可以看出,属性内部本质上就是set_、get_方法

classPerson

{

publicintAge

get

return3;

}

set

Personp1=newPerson();

p1.Age=30;

p1.Age++;

Console.Write(p1.Age);//输出3

必须手写掌握的代码(既包含拿电脑写,拿笔写):

手写三层架构手写冒泡排序手写AJAX:XMLHttpRequest手写增删改查、SQLHelper8、三层架构

通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。

优点:分工明确,条理清晰,易于调试,而且具有可扩展性。

缺点:增加成本。

9、什么是装箱(boxing)和拆箱(unboxing)?(*)

Object是引用类型,但是它的子类Int32竟然不能去Object能去的“要求必须是引用类型”

的地方,违反了继承的原则,所以需要把Int32装在Object中才能传递。

装箱:从值类型接口转换到引用类型。

拆箱:从引用类型转换到值类型。

objectobj=null;//引用类型

obj=1;//装箱,boxing。把值类型包装为引用类型。

inti1=(int)obj;//拆箱。unboxing

2)下面三句代码有没有错,以inboxing或者unboxing为例,解释一下内存是怎么变化的

inti=10;

objectobj=i;

intj=obj;

分析:在inboxing(装箱)时是不需要显式的类型转换的,不过unboxing(拆箱)需要显式的类型转换,所以第三行代码应该改为:

3intj=(int)obj;

要掌握装箱与拆箱,就必须了解CTS及它的特点:

CTS中的所有东西都是对象;所有的对象都源自一个基类——System.Object类型。值类型的一个最大的特点是它们不能为null,值类型的变量总有一个值。为了解决值类型不可以为null,引用类型可以为null的问题,微软在.Net中引入了装箱和拆箱:装箱就是将值类型用引用类型包装起来转换为引用类型;而从引用类型中拿到被包装的值类型数据进行拆箱。

10、CTS、CLS、CLR分别作何解释(*)把英文全称背过来。

C#和.Net的关系。

C#只是抽象的语言,可以把C#编译生成Java平台的二进制代码,也可以把Java代码编译生成.Net平台的二进制代码。所以C#只是提供了if、while、+-*/、定义类、int、string等基础的语法,而Convert.ToInt32、FileStream、SqlConnection、String.Split等都属于.Net的东西。深蓝色是C#的,浅蓝色是.Net的。

C#new→IL:newobj

C#string→.Net中的String

类型的差别:.net中的Int32在C#中是int,在VB.Net中是Integer。String、Int32等公共类型。

语法的差别:IL中创建一个对象的方法是L_0001:newobjinstancevoid索引.C1::.ctor()

C#中是newC1();VB.net中是Dimc1AsNewC1

CTS:CommonTypeSystem通用类型系统。Int32、Int16→int、String→string、Boolean→bool。每种语言都定义了自己的类型,.Net通过CTS提供了公共的类型,然后翻译生成对应的.Net类型。

CLS:CommonLanguageSpecification通用语言规范。不同语言语法的不同。每种语言都有自己的语法,.Net通过CLS提供了公共的语法,然后不同语言翻译生成对应的.Net语法。

CLR:CommonLanguageRuntime公共语言运行时,就是GC、JIT等这些。有不同的CLR,比如服务器CLR、LinuxCLR(Mono)、SilverlightCLR(CoreCLR)。相当于一个发动机,负责执行IL。

11、在dotnet中类(class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。

Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。加分的回答:Int32、Boolean等都属于结构体

12、堆和栈的区别?

栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

13、能用foreach遍历访问的对象的要求

14、GC是什么为什么要有GC

C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net中由GC进行垃圾回收像餐馆中店员去回收。

GC是垃圾收集器(GarbageCollection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。

要请求垃圾收集,可以调用下面的方法:GC.Collect()一般不需要手动调用GC.Collect()。当一个对象没有任何变量指向(不再能使用)的时候就可以被回收了。

基础知识:当没有任何变量指向一个对象的时候对象就可以被回收掉了,但不一定会立即被回收。

objectobj=newobject();//只有new才会有新对象

Console.WriteLine(obj);

objectobj2=obj;

obj=null;

obj2=null;

Console.WriteLine();

15、值类型和引用类型的区别?

1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

2.值类型不可能派生出新的类型:所有的值类型均隐式派生自System.ValueType。但与引用类型相同的是,结构也可以实现接口。

3.值类型不可能包含null值:然而,可空类型功能允许将null赋给值类型。

4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

16、C#中的接口和类有什么异同。

不同点:

不能直接实例化接口。

接口不包含方法的实现。

接口可以多继承,类只能单继承。

类定义可在不同的源文件之间进行拆分。

相同点:

接口、类和结构都可以从多个接口继承。

接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

接口和类都可以包含事件、索引器、方法和属性。

基础知识:接口只能定义方法(只能定义行为,不能定义实现也就是字段),因为事件、索引器、属性本质上都是方法,所以接口中也可以定义事件、索引器、属性。

17、abstractclass和interface有什么区别

都不能被直接实例化,都可以通过继承实现其抽象方法。

接口支持多继承;抽象类不能实现多继承。

接口只能定义行为;抽象类既可以定义行为,还可能提供实现。

接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;

抽象类可以定义字段、属性、包含有实现的方法。

接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

加分的补充回答:讲设计模式的时候SettingsProvider的例子。

18、是否可以继承String类

String类是sealed类故不可以继承。

19、int、DateTime、string是否可以为null

null表示“不知道”,而不是“没有”。没有年龄和不知道年龄是不一样。

数据库中null不能用0表示。0岁和不知道多少岁不一样。

Sexiszero。《色即是空》

//inti1=null;

//inti2=null;//值类型后加就成了可空数据类型

////inti3=i2;//所以把可空的赋值给一定不能为空的会报错。

//inti4=(int)i2;//可以显式转换,由程序员来保证“一定不为空”

//inti5=i4;//一定会成功!

//using()→try{]catch{}finally{}

//int是微软的一个语法糖。是一种和int没有直接关系的Nullable类型

Nullabled1=newNullable();//intd1=null;

Nullabled2=newNullable(3);//intd2=3;

Console.WriteLine(d1==null);

int、DateTime不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null。string可以为null。

C#中int等值类型不可以为null、而数据库中的int可以为null,这就是纠结的地方。int就变成了可空的int类型。bool、DateTime

inti1=3;

inti2=i1;

//inti3=i2;//不能把可能为空的赋值给一定不能为空的变量

inti3=(int)i2;//显式转换

可空数据类型经典应用场景:三层中的Model属性的设计。

int翻译生成.Net的Nullable,CTS。

20、using关键字有什么用?什么是IDisposable?

21、XML与HTML的主要区别

HTML:

XML:

XML是用来存储和传输数据的

HTML是用来显示数据的

如果使用了完全符合XML语法要求的HTML,那么就叫做符合XHTML标准。符合XHTML标准的页面有利于SEO。

22、stringstr=null与stringstr=””说明其中的区别。

答:stringstr=null是不给他分配内存空间,而stringstr=""给它分配长度为空字符串的内存空间。stringstr=null没有string对象,stringstr=“”有一个字符串对象。

strings3=string.Empty;//反编译发现,string.Empty就是在类构造函数中Empty="";

23、写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。

答:解1:selecttop10*fromAwhereidnotin(selecttop30idfromA)

演变步骤:

1)selecttop30idfromT_FilterWords--取前条

2)select*fromT_FilterWords

whereidnotin(selecttop30idfromT_FilterWords)--取id不等于前三十条的

--也就是把前条排除在外

3)selecttop10*fromT_FilterWords

whereidnotin(selecttop30idfromT_FilterWords)

--取把前条排除在外的前条,也就是-40条

解2:selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA)

解答3:用ROW_NUMBER实现

24、在.Net中所有可序列化的类都被标记为

[serializable]

25、什么是code-Behind技术。

就是代码隐藏,在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。比如分工,美工和编程的可以个干各的,不用再像以前asp那样都代码和html代码混在一起,难以维护。code-Behind是基于部分类技术实现的,在我的项目的三层代码生成器中用到了部分类。

b)索引器和字段;c)事件和字段;

27、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(c)。a)insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行;b)ExecuteNonQuery()方法返回执行Sql语句所影响的行数。c)Select操作的Sql语句只能由ExecuteReader()方法来执行;d)ExecuteReader()方法返回一个DataReader对象;

拿SQLHelper实现一下。

28、StringBuilder和String的区别?

答:String在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用StringBuilder,不要使用String

29、请叙述属性与索引器的区别。(*)

属性索引器

通过名称标识。通过签名标识。

通过简单名称或成员访问来访问。通过元素访问来访问。

可以为静态成员或实例成员。必须为实例成员。

属性的get访问器没有参数。索引器的get访问器具有与索引器相同的形参表。

属性的set访问器包含隐式value参数。除了value参数外,索引器的set访问器还具有与索引器相同的形参表。

30、请解释ASP。NET中的web页面与其隐藏类之间的关系?

<%@Pagelanguage="c#"Codebehind="Tst1.aspx.cs"AutoEventWireup="false"Inherits="T1.Tst1"%>

Codebehind="Tst1.aspx.cs"表明经编译此页面时使用哪一个代码文件

Inherits="T1.Tst1"表用运行时使用哪一个隐藏类

aspx页面会编译生成一个类,这个类从隐藏类继承。

31、您在什么情况下会用到虚方法?它与接口有什么不同?

答案:子类重新定义父类的某一个方法时,必须把父类的方法定义为virtual

在定义接口中不能有方法体,虚方法可以。

实现时,子类可以不重新定义虚方法,但如果一个类继承接口,那必须实现这个接口。

32、DataReader和DataSet的异同?

DataReader使用时始终占用SqlConnection,在线操作数据库

每次只在内存中加载一条数据,所以占用的内存是很小的

是只进的、只读的

DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接(非连接模式)

DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作(动态操作读入到内存的数据)

33、publicstaticconstintA=1;这段代码有错误么?

错误:const不能被修饰为static;因为定义为常量(const)后就是静态的(static)。

34、传入某个属性的set方法的隐含参数的名称是什么?

value,它的类型和属性所声名的类型相同。

35、C#支持多重继承么?

类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。类是爹、接口是能力,能有多个能力,但不能有多个爹。

36、C#中所有对象共同的基类是什么?

System.Object

37、通过超链接怎样传递中文参数?

答:用URL编码,通过QueryString传递,用urlencode编码用urldecode解码

38、string、String;int、Int32;Boolean、bool的区别

String、Int32、Boolean等都属于.Net中定义的类,而string、int、bool相当于C#中对这些类定义的别名。CTS。

39、Server.Transfer和Response.Redirect的区别是什么?(常考)

答:Server.Transfer仅是服务器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;Response.Redirect则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

Server.Transfer是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。这个过程中浏览器和Web服务器之间经过了一次交互。

Response.Redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求。这个过程中浏览器和Web服务器之间经过了两次交互。

Server.Transfer不可以转向外部网站,而Response.Redirect可以。

Server.Execute效果和Server.Transfer类似,但是是把执行的结果嵌入当前页面。

40、不是说字符串是不可变的吗?strings="abc";s="123"不就是变了吗?

String是不可变的在这段代码中,s原先指向一个String对象,内容是"abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

41、是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部不能发出对非static方法的调用。

42、说出一些常用的类、接口,请各举5个

要让人家感觉你对.Net开发很熟,所以,不能仅仅只列谁都能想到的那些东西,要多列你在做项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。

常用的类:StreamReader、WebClient、Dictionary、StringBuilder、SqlConnection、FileStream、File、Regex、List

常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary

要出乎意料!不要仅仅完成任务!笔试不是高考!处处要显出牛!

说出几个开源软件?MySQL、Linux、Discuz、Apache、Paint.Net、Android、Chrome、Notepad++……

开源项目有一些是开发包。开源软件指的是可以直接用的。Jquery、NPOI、ASP.NetMVC、SilverlightToolkit、AJAXtoolkit、json.net

43、编写一个单例(Singleton)类。

把构造函数设置为private,设置一个public、static的对象实例

publicFileManager

privateFileManager(){}

publicreadonlystaticFileManagerInstance=newFileManager();

扩展:搜“C#Singleton”,有线程安全的更牛B的实现

44、什么是sql注入?如何避免sql注入?

用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL语句。使用参数化的SQL就可以避免SQL注入。

详细参考复习ppt。举例子,摆事实!

1'or1=1

45、数据库三范式是什么

用自己的话解释,而不是背概念。

第一范式:字段不能有冗余信息,所有字段都是必不可少的。

第二范式:满足第一范式并且表必须有主键。

第三范式:满足第二范式并且表引用其他的表必须通过主键引用。

员工内部→自己的老大→外部的老大

记忆顺序:自己内部不重复→别人引用自己→自己引用别人。

46、post、get的区别

get的参数会显示在浏览器地址栏中,而post的参数不会显示在浏览器地址栏中;

使用post提交的页面在点击【刷新】按钮的时候浏览器一般会提示“是否重新提交”,而get则不会;

用get的页面可以被搜索引擎抓取,而用post的则不可以;

用post可以提交的数据量非常大,而用get可以提交的数据量则非常小(2k),受限于网页地址的长度。

用post可以进行文件的提交,而用get则不可以。

47、.Net、ASP.Net、C#、VisualStudio之间的关系是什么?

答:.Net一般指的是.NetFramework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调用,.NetFramework还提供了CLR、JIT、GC等基础功能。

ASP.Net是.Net中用来进行Web开发的一种技术,ASP.Net的页面部分写在aspx文件中,逻辑代码通常通过Code-behind的方式用C#、VB.Net等支持.Net的语言编写。

C#是使用最广泛的支持.Net的编程语言。除了C#还有VB.Net、IronPython等。

VisualStudio是微软提供的用来进行.Net开发的集成开发环境(IDE),使用VisualStudio可以简化很多工作,不用程序员直接调用csc.exe等命令行进行程序的编译,而且VisualStudio提供了代码自动完成、代码高亮等功能方便开发。除了VisualStudio,还有SharpDevelop、MonoDevelop等免费、开源的IDE,VisualStudioExpress版这个免费版本。

48、AJAX解决什么问题?如何使用AJAX?AJAX有什么问题需要注意?项目中哪里用到了AJAX?

答:AJAX解决的问题就是“无刷新更新页面”,用传统的HTML表单方式进行页面的更新时,每次都要将请求提交到服务器,服务器返回后再重绘界面,这样界面就会经历:提交→变白→重新显示这样一个过程,用户体验非常差,使用AJAX则不会导致页面重新提交、刷新。

AJAX最本质的实现是在Javascript中使用XMLHttpRequest进行Http的请求,开发中通常使用UpdatePanel、JQuery等方式简化AJAX的开发,UpdatePanel的方式实现AJAX最简单,但是数据通讯量比较大,因为要来回传整个ViewState,而且不灵活,对于复杂的需求则可以使用JQuery提供的ajax功能。

UpdatePanel的内部原理。

AJAX最重要的问题是无法跨域请求(www.rupeng.com→so.rupeng.com),也就是无法在页面中向和当前域名不同的页面发送请求,可以使用在当前页面所在的域的服务端做代理页面的方式解决。

常考:不用任何框架编写一个AJAX程序。XHR:XmlHttpRequest。背也要背下来!

如果面试的时候谈AJAX谈到UpdatePanel的时候,就是NB的时候!!!先侃UpdatePanel的原理!引出为什么Dom操作的动态效果在用UpdatePanel提交刷新以后没有了,以及CKEditor被套在UpdatePanel中提交以后也变成了textarea,为什么把Fileupload放到Updatepanel中无法实现无刷新上传。说成是公司内部的一个菜鸟用UpdatePanel遇到这样问题,由于我懂XHR、UpdatePanel的原理,所以轻松解决!UpdatePanel生成的上万行JS脚本,不适合于互联网项目。“WebForm怎么可能把开发人员编程傻子呢!不明白原理苦命呀!还是MVC好呀,MVC。。。。。。。”

49、Application、Cookie和Session两种会话有什么不同?

答:Application是用来存取整个网站全局的信息,而Session是用来存取与具体某个访问者关联的信息。Cookie是保存在客户端的,机密信息不能保存在Cookie中,只能放小数据;Session是保存在服务器端的,比较安全,可以放大数据。

谈到Session的时候就侃Session和Cookie的关系:Cookie中的SessionId。和别人对比说自己懂这个原理而给工作带来的方便之处。

50、开放式问题:你经常访问的技术类的网站是什么?

博客园(www.cnblogs.com)、csdn、codeplex、codeproject、msdn文档、msdn论坛(遇到问题先到网上搜解决方案,还不行就问同事,同事也解决不了就去MSDN论坛提问,一定能得到解决)。Cnbeta.com。

八、数据库优化经验(后端工程师非常常见)出现指数:四颗星主要考点:此题考察后端工程师操作数据库的经验。说实话,数据库是博主的弱项,博主觉得对于这种考题,需要抓住几个常用并且关键的优化经验,如果说得不对,欢迎大家斧正。参考答案:1、数据库运维方面的优化:启用数据库缓存。对于一些比较常用的查询可以采用数据库缓存的机制,部署的时候需要注意设置好缓存依赖项,防止“过期”数据的产生。2、数据库索引方面的优化:比如常用的字段建索引,联合查询考虑联合索引。(PS:如果你有基础,可以敞开谈谈聚集索引和非聚集索引的使用场景和区别)3、数据库查询方面的优化:避免select*的写法、尽量不用in和notin这种耗性能的用法等等。4、数据库算法方面的优化:尽量避免大事务操作、减少循环算法,对于大数据量的操作,避免使用游标的用法等等。

1、什么是面向对象?面向对象说到底就是一种思想,任何事物都可以看作是一个对象。在有些面试题目中也称之为OOP(ObjectOrientedProgramming)。分开来解读就是:Object:对象Oriented:面向的Programming:程序设计面向对象就是把一个人或事务的属性,比如名字,年龄这些定义在一个实体类里面。存和取的时候直接使用存取实体类就把这个人的名字,年龄这些全部存了,这个实体类就叫对象,这种思想就叫面向对象。面向对象开发具有以下优点:代码开发模块化,便于维护。代码复用性强代码的可靠性和灵活性。代码的可读性和可扩展性。

五、谈谈你对设计模式的认识?结合你用得最多的一种设计模式说说它的使用。出现指数:五颗星主要考点:不用多说,这题考的就是对设计模式的理解。一般为了简单可能会要求你写一个单例模式,注意最好是写一个完整点的,考虑线程安全的那种。然后会让你说说你在项目中什么情况下会用到这种模式参考答案:通用写法

1publicclassSingleton2{3//定义一个静态变量来保存类的实例4privatestaticSingletonuniqueInstance;5//定义一个标识确保线程同步6privatestaticreadonlyobjectlocker=newobject();7//定义私有构造函数,使外界不能创建该类实例8privateSingleton()9{10}11///

十、谈谈你的优点和缺点?出现指数:四颗星主要考点:这道题让人有一种骂人的冲动,但是没办法,偏偏很多所谓的大公司会问这个。比如华为。这个问题见仁见智,答案可以自己组织。参考答案:优点:对于新的技术学**能力强,能很快适应新环境等等缺点:对技术太过于执着等等

十三、说说你最擅长的技术?并说说你是如何使用的?出现指数:三颗星主要考点:这是一道非常开放的面试题。最初遇到这种问题,博主很想来一句:你妹,这叫什么问题!但确实有面试官问到。回头想想,其实此题考查你擅长的技术的涉及深度。其实博主觉得对于这个问题,可以结合你项目中用到的某一个技术来说就好了。参考答案:简单谈谈MEF在我们项目里面的使用吧。在谈MEF之前,我们必须要先谈谈DIP、IOC、DI依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念)控制反转(IoC):一种反转流、依赖和接口的方式(DIP的具体实现方式)。依赖注入(DI):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)。什么意思呢?也就是说,我们在软件架构的过程中,层和层之间通过接口依赖,下层不是直接给上层提供实现,而是提供接口,具体的实现以依赖注入的方式在运行的时候动态注入进去。MEF就是实现依赖注入的一种组件。它的使用使得UI层不直接依赖于BLL层,而是依赖于中间的一个IBLL层,在程序运行的时候,通过MEF动态将BLL里面的实现注入到UI层里面去,这样做的好处是减少了层与层之间的耦合。这也正是面向接口编程方式的体现。

十四、自己写过JS组件吗?举例说明。出现指数:三颗星主要考点:此题考的js组件封装和js闭包的一些用法。一般来说,还是笔试出现的几率较大。参考答案:自定义html的select组件

调用的时候1$("#sel_search_orderstatus").combobox({2url:'/apiaction/Order/OrderApi/GetOrderStatu',3valueField:'VALUE',4textField:'NAME'5});就能自动从后台取数据,注意valueField和textField对应要显示和实际值。

3.列举ASP.NET页面之间传递值的几种方式。答.1.Request.QueryString2.Request.Form3.Session4.Application5.Cache6.Cookie7.Server.Transfer8.Database9.HttpContext的Item属性等

4.a=10,b=15,请在不使用第三方变量的情况下,把a、b的值互换答:inta=a+b;intb=a-b;inta=a-b;

5.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?答:一般为3层:数据访问层,业务层,表示层。数据访问层对数据库进行增删查改。业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。表示层为了与用户交互例如用户添加表单。优点:分工明确,条理清晰,易于调试,而且具有可扩展性。缺点:增加成本。

7.GC是什么为什么要有GC答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()Runtime.getRuntime().gc()

8.启动一个线程是用run()还是start()答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

9.是否可以继承String类答:String类是final类故不可以继承。

10.session喜欢丢值且占内存,Cookis不安全,请问用什么办法代替这两种原始的方法答:redis或者memcache。当然,微软也提供了解决方案。iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sateserver或SQLServer数据库的方式。

11.IOC容器?

12、什么是委托,事件是不是一种委托?

14.WebApi概述WebAPI是在.NETFramework之上构建的Web的API的框架,WebAPI是一个编程接口,用于操作可通过标准HTTP方法和标头访问的系统,WebAPI需要基于.NET3.5或更高版本才可以进行开发

15.什么是WebServicewebservice是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互,是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范。

16.存储过程是什么?有什么用?有什么优点?用什么来调用?存储过程是预编译,安全性高,也是大大提高了效率,存储过程可以重复使用以减少数据库开发人员的工作量,复杂的逻辑我们可以使用存储过程完成,在存储过程中我们可以使用临时表,还可以定义变量,拼接sql语句,调用时,只需执行这个存储过程名,传入我们所需要的参数即可。17.何为触发器?触发器是一种特殊的存储过程,主要是通过事件触发而被执行。它可以强化约束来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以级联运算。常见的触发器有三种:分别应用于Insert,Update,Delete事件。

18.什么叫做泛型?只是为了去掉重复代码,应对不同类型的共同需求。

21.NET的错误处理机制是什么?.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

22.C#可否对内存进行直接的操作?在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法。

24.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?this.Server.Transfer、Response.Redirect()、QueryString

26.简要谈一下您对微软.NET架构下remoting和webservice两项技术的理解以及实际中的应用。WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。remoting是.net中用来跨越machine,process,appdomain进行方法调用的技术,对于三成结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM。WebService是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。WebService令基于组件的开发和web的结合达到最佳,基于组件的对象模型。

27.什么是反射?动态获取程序集信息。

28.override与重载的区别?重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。Override是子类对基类中函数的重写。为了适应需要。

29.装箱和拆箱的概念和原理装箱是将值类型转化为引用类型的过程;拆箱是将引用类型转化为值类型的过程

在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通信协议。接下去介绍TCP/IP中有两个具有代表性的传输层协议----TCP和UDP。二、UDPUDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。它有以下几个特点:

从上面的动态图可以得知,UDP只会把想发的数据报文一股脑的丢给对方,并不在意数据有无安全完整到达。5.头部开销小,传输数据报文时是很高效的。

UDP头部包含了以下几个数据:两个十六位的端口号,分别为源端口(可选字段)和目标端口整个数据报文的长度整个数据报文的检验和(IPv4可选字段),该字段用于发现头部信息和数据中的错误因此UDP的头部开销小,只有八字节,相比TCP的至少二十字节要少得多,在传输数据报文时是很高效的三、TCP当一台计算机想要与另一台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。例如,当你想查看网页或查看电子邮件时,希望完整且按顺序查看网页,而不丢失任何内容。当你下载文件时,希望获得的是完整的文件,而不仅仅是文件的一部分,因为如果数据丢失或乱序,都不是你希望得到的结果,于是就用到了TCP。TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。

第一次握手客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入SYN-SENT状态。第二次握手服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入SYN-RECEIVED状态。第三次握手当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接建立成功。这里可能大家会有个疑惑:为什么TCP建立连接需要三次握手,而不是两次?这是因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。

publicvoidCalculate(){doubleDiameter=0.5;Console.Write("TheperimeterOfCirclewithaDiameterof{0}is{1}"Diameter,Diameter*Math.PI);}二)使用Delegate.BeginInvokedelegatedoubleCalculateMethod(doubleDiameter);//申明一个委托,表明需要在子线程上执行的方法的函数签名staticCalculateMethodcalcMethod=newCalculateMethod(Calculate);//把委托和具体的方法关联起来staticvoidMain(string[]args){//此处开始异步执行,并且可以给出一个回调函数(如果不需要执行什么后续操作也可以不使用回调)calcMethod.BeginInvoke(5,newAsyncCallback(TaskFinished),null);Console.ReadLine();}

//线程调用的函数,给出直径作为参数,计算周长publicstaticdoubleCalculate(doubleDiameter){returnDiameter*Math.PI;}

//线程完成之后回调的函数publicstaticvoidTaskFinished(IAsyncResultresult){doublere=0;re=calcMethod.EndInvoke(result);Console.WriteLine(re);}

这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。

异步和多线程有什么关联有一句话总结的很好:多线程是实现异步的一种手段和工具我们通常把多线程和异步等同起来,实际是一种误解,在实际实现的时候,异步有许多种实现方法,我们可以用进程来做异步,或者使用纤程,或者硬件的一些特性,比如在实现异步IO的时候,可以有下面两个方案:1)可以通过初始化一个子线程,然后在子线程里进行IO,而让主线程顺利往下执行,当子线程执行完毕就回调2)也可以根本不使用新线程,而使用硬件的支持(现在许多硬件都有自己的处理器),来实现完全的异步,这是我们只需要将IO请求告知硬件驱动程序,然后迅速返回,然后等着硬件IO就绪通知我们就可以了实际上DotNetFramework里面就有这样的例子,当我们使用文件流的时候,如果制定文件流属性为同步,则使用BeginRead进行读取时,就是用一个子线程来调用同步的Read方法,而如果指定其为异步,则同样操作时就使用了需要硬件和操作系统支持的所谓IOCP的机制

WinForm多线程编程篇我的多线程WinForm程序老是抛出InvalidOperationException,怎么解决?在WinForm中使用多线程时,常常遇到一个问题,当在子线程(非UI线程)中修改一个控件的值:比如修改进度条进度,时会抛出如下错误Cross-threadoperationnotvalid:Control'XXX'accessedfromathreadotherthanthethreaditwascreatedon.在VS2005或者更高版本中,只要不是在控件的创建线程(一般就是指UI主线程)上访问控件的属性就会抛出这个错误,解决方法就是利用控件提供的Invoke和BeginInvoke把调用封送回UI线程,也就是让控件属性修改在UI线程上执行,下面列出会报错的代码和他的修改版本

ThreadStartthreadStart=newThreadStart(Calculate);//通过ThreadStart委托告诉子线程讲执行什么方法Threadthread=newThread(threadStart);thread.Start();publicvoidCalculate(){doubleDiameter=0.5;doubleresult=Diameter*Math.PI;CalcFinished(result);//计算完成需要在一个文本框里显示}publicvoidCalcFinished(doubleresult){this.TextBox1.Text=result.ToString();//会抛出错误}上面加粗的地方在debug的时候会报错,最直接的修改方法是修改Calculate这个方法如下

delegatevoidchangeText(doubleresult);

publicvoidCalculate(){doubleDiameter=0.5;doubleresult=Diameter*Math.PI;this.BeginInvoke(newchangeText(CalcFinished),t.Result);//计算完成需要在一个文本框里显示}这样就ok了,但是最漂亮的方法是不去修改Calculate,而去修改CalcFinished这个方法,因为程序里调用这个方法的地方可能很多,由于加了是否需要封送的判断,这样修改还能提高非跨线程调用时的性能

publicvoidCalcFinished(doubleresult){if(this.InvokeRequired){this.BeginInvoke(newchangeText(CalcFinished),t.Result);}else{this.TextBox1.Text=result.ToString();}}上面的做法用到了Control的一个属性InvokeRequired(这个属性是可以在其他线程里访问的),这个属性表明调用是否来自另非UI线程,如果是,则使用BeginInvoke来调用这个函数,否则就直接调用,省去线程封送的过程

Invoke,BeginInvoke干什么用的,内部是怎么实现的这两个方法主要是让给出的方法在控件创建的线程上执行Invoke使用了Win32API的SendMessage,UnsafeNativeMethods.PostMessage(newHandleRef(this,this.Handle),threadCallbackMessage,IntPtr.Zero,IntPtr.Zero);BeginInvoke使用了Win32API的PostMessageUnsafeNativeMethods.PostMessage(newHandleRef(this,this.Handle),threadCallbackMessage,IntPtr.Zero,IntPtr.Zero);这两个方法向UI线程的消息队列中放入一个消息,当UI线程处理这个消息时,就会在自己的上下文中执行传入的方法,换句话说凡是使用BeginInvoke和Invoke调用的线程都是在UI主线程中执行的,所以如果这些方法里涉及一些静态变量,不用考虑加锁的问题

stringreadpath="e:\RHEL4-U4-i386-AS-disc1.iso";stringwritepath="e:\kakakak.iso";byte[]buffer=newbyte[90000000];

FileStreamoutputfs=File.OpenWrite(writepath);Console.WriteLine("同步流");

//然后在写文件期间查看线程池的状况

ShowThreadDetail("初始状态");

FileStreamfs=File.OpenRead(readpath);

fs.BeginRead(buffer,0,90000000,delegate(IAsyncResulto){

outputfs.BeginWrite(buffer,0,buffer.Length,

delegate(IAsyncResulto1){

Thread.Sleep(1000);

ShowThreadDetail("BeginWrite的回调线程");

},null);

Thread.Sleep(500);//thisisimportantcausewithoutthis,thisThreadandtheoneusedforBeginReadMayseemtobesameone},

null);

Console.ReadLine();

publicstaticvoidShowThreadDetail(stringcaller){intIO;intWorker;ThreadPool.GetAvailableThreads(outWorker,outIO);Console.WriteLine("Worker:{0};IO:{1}",Worker,IO);}输出结果

异步流

Worker:500;IO:1000

Worker:500;IO:999

同步流

Worker:499;IO:1000

锁定与同步CLR怎样实现lock(obj)锁定从原理上讲,lock和SyncronizedAttribute都是用Moniter.Enter实现的,比如如下代码objectlockobj=newobject();lock(obj){//dothings}在编译时,会被编译为类似try{Moniter.Enter(obj){//dothings}}catch{}finally{Moniter.Exit(obj);}

而[MethodImpl(MethodImplOptions.Synchronized)]标记为同步的方法会在编译时被lock(this)语句所环绕所以我们只简单探讨Moniter.Enter的实现(注:DotNet并非使用Win32API的CriticalSection来实现Moniter.Enter,不过他为托管对象提供了一个类似的结构叫做Syncblk)每个对象实例头部都有一个指针,这个指针指向的结构,包含了对象的锁定信息,当第一次使用Moniter.Enter(obj)时,这个obj对象的锁定结构就会被初时化,第二次调用Moniter.Enter时,会检验这个object的锁定结构,如果锁没有被释放,则调用会阻塞

Web和IIS应用程序池,WebApplication,和线程池之间有什么关系一个应用程序池是一个独立的进程,拥有一个线程池,应用程序池中可以有多个WebApplication,每个运行在一个单独的AppDomain中,这些WebApplication公用一个线程池不同的AppDomain保证了每个WebApplication的静态变量不会互相干扰,不同的应用程序池保证了一个网站瘫痪,其他不同进程中的站点还能正常运行下图说明了他们的关系

Web页面怎么调用异步WebService把Page的Async属性设置为true,就可以调用异步的方法,但是这样调用的效果可能并不如我们的相像,请参考Web中使用多线程来增强用户体验

C#模态对话框和非模态对话框模态对话框弹出窗口阻止调用窗口的所有消息响应。只有在弹出窗口结束后调用窗口才能继续。在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。

非模态对话框可以在弹出窗口和调用窗口之间随意切换。调用窗口调用show方法后,下面的代码可以立即执行。在非模态窗口关闭后,窗口的所有资源被释放,窗口不存在,无法获取窗口的任何信息。所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换概念说明1模态窗口打开模态窗口后,只要不关闭该窗口,鼠标焦点或者光标就会一直停留在该窗口上。只有关闭该窗口后,调用窗口才能继续。模态窗口关闭后,仍可以读取模态窗口中的信息,如窗口的返回状态等。2非模态窗口打开非模态窗口后,仍可以操作调用窗口。关闭非模态窗口,该窗口将不复存在,会释放窗口的所有资源,所以无法得到该窗口的任何信息。实例说明1建立Windows窗体程序ShowAndShowDialogExp,程序主画面包含两个按钮,用于打开模态窗口和非模态窗口(如下图所示)。2编写按钮的Click事件代码

privatevoidbutton1_Click(objectsender,EventArgse){Formfrm1=newForm();frm1.Text="我是模态窗口!";frm1.ShowDialog();//打开模态窗口(对话框)}privatevoidbutton2_Click(objectsender,EventArgse){Formfrm2=newForm();frm2.Text="我是非模态窗口!";frm2.Show();//打开非模态窗口(对话框)}

3运行代码,进行操作体验点击按钮“打开模态窗口”,打开模态窗口frm1,窗口标题栏显示“我是模态窗口!”,此时无法切换到调用窗口,当关闭该窗口后,又可以继续操作调用窗口了。点击按钮“打开非模态窗口”,打开非模态窗口frm2,此时,可以仍切换到调用窗口操作调用窗口。4实例结论C#中使用Show()方法打开非模态窗口,使用ShowDialog()方法打开模态窗口。5进阶修改前面按钮的Click事件代码,修改后的代码如下所示。

privatevoidbutton1_Click(objectsender,EventArgse){Formfrm1=newForm();frm1.Text="我是模态窗口!";frm1.ShowDialog();//打开模态窗口(辍对话框)MessageBox.Show(frm1.DialogResult.ToString());}privatevoidbutton2_Click(objectsender,EventArgse){Formfrm2=newForm();frm2.Text="我是非模态窗口!";frm2.Show();//打开非模态窗口(对话框)MessageBox.Show(frm2.DialogResult.ToString());}

朋友,发现跟前面代码的区别了吗?呵呵,仅仅加了一句输出弹出窗口的DialogResult属性值的代码而已。再次执行代码,程序的运行情况是:点击“打开模态窗口”打开模态窗口,接着关闭模态窗口,会弹出消息框,输出“Cancel”(frm1.DialogResult.ToString()的结果)。点击“打开非模态窗口”打开非模态窗口后,便会弹出消息框,输出“None”(frm2.DialogResult.ToString()的结果)。从程序执行情况我们了解到:执行Show()方法后,后面的代码会立即执行;而执行ShowDialog()方法后,后面的代码需要等弹出窗口关闭后才能及时执行。前面说到:模态窗口关闭后,仍可以读取模态窗口中的信息。这主要是因为:当“关闭”模态窗口后,窗体并没有被真的被“关闭”,因为用户点击“关闭”按钮或者设置DialogResult属性值时,并没有调用窗体的Close方法,只是将窗体的Visible属性赋值为false,隐藏了窗体而已。这样隐藏的窗体是可以被重新显示的,且窗体资源并没有被释放。所以,在你真的不需要这个窗体时,一定要记得Dispose一下哦。为了说明这一切,修改前面打开模态窗口的按钮Click事件代码。

privatevoidbutton1_Click(objectsender,EventArgse){Formfrm1=newForm();frm1.Text="我是模态窗口!";frm1.ShowDialog();//打开模态窗口(对话框)MessageBox.Show(frm1.DialogResult.ToString());frm1.Visible=true;}

THE END
1.三下五除二什么意思三下五除二的意思1、三下五除二是汉语成语,原为珠算口诀之一。现多形容做事干脆利索。2、算盘是中国古代一种有效的计算工具,其功能相当于现代社会的计算器。“三下五除二”是珠算中最基本的加法口诀之一,由于古时借助于简单、易记的口诀,人们可在算盘上进行一系列运算,因而“三下五除二”这条基本口诀便产生了“迅速、快捷”的意https://edu.iask.sina.com.cn/jy/2tFTrgpLxbZ.html
2.三下五除二的法语解释和发音三下五除二的翻译『法语助手』为您提供三下五除二的用法讲解,告诉您准确全面的三下五除二的中文意思,三下五除二的读音,三下五除二的同义词,三下五除二的反义词,三下五除二的例句。http://cn2b.frdic.com/dicts/fr/%E4%B8%89%E4%B8%8B%E4%BA%94%E9%99%A4%E4%BA%8C
3.三下五除二怎么读,三下五除二的发音,三下五除二的拼音,三下五除二三下五除二解释 三下五除二是什么意思词义解释来源:辞典修订版 1:珠算加法口诀之一。比喻做事明快。如:「老板出马三下五除二一会儿功夫就把生意谈成了。」 三下五除二是什么意思词义解释来源:成语词典版 1:修订本参考资料:珠算加法口诀之一。比喻做事明快。如:老板出马三下五除二一会儿功夫就把生意谈成了。https://www.chacihai.com/cidian/16946.html
4.三下五除二是什么意思怎么读基本解释 ◎ 三下五除二 sān xià wǔ chú èr [at one go] 原为珠算口诀,现在常用来形容办事或动作敏捷利落。近似“三下两下” 详细解释 珠算加法口诀之一。常用以比喻行动果断敏捷。 老舍 《二马》第三段七:“﹝ 马老先生 ﹞把一罐凉水又三下五除二的灌下去,灌得嗓子里直起水泡。” 杜鹏程 《https://1saying.com/expression/397833
5.三下五除二的解释三下五除二的意思汉典“三下五除二”词语的解释形容做事及动作干脆利索。 ? 汉典 三下五除二网络解释 百度百科 三下五除二 (汉语词语) 1.成语,解释为珠算口诀。多形容做事干脆利索。习语“三下五除二”与盘有关。 2.新兴网络讽刺暗语,多形做事不靠谱,异于常人。 3.网络影评节目名称《三下五除二》 ? 汉典https://www.zdic.net/hans/%E4%B8%89%E4%B8%8B%E4%BA%94%E9%99%A4%E4%BA%8C
6.三下五除二的意思三下五除二是什么意思解释: 珠算口诀。形容做事及动【hao86.com好工具】作干脆利索。 出处: 清·文康《儿女英雄传》第36回:“偶然在家闲一刻,便见他姊妹两个‘三下五除二’的不离手,‘五亩七分半’的不离口。” 语法: 三下五除二作状语、分句;指人做事。 示例: https://www.hao86.com/idiom_view_9bdd9f43ac9bdd9f/
7.三下五除二的意思三下五除二的解释三下五除二成语故事成语解释: 珠算口诀。形容做事及动作干脆利索。 成语出处: 清·文康《儿女英雄传》第36回:“偶然在家闲一刻,便见他姊妹两个‘三下五除二’的不离手,‘五亩七分半’的不离口。” 常用程度: 常用成语 感情色彩: 中性成语 成语用法: 作状语、分句;指人做事 成语结构: 复句式成语 产生年代: 近代成语 近义词:https://www.72jixie.com/chengyu/24740.html
8.三下五除二什么意思试题来源: 解析 三下五除二是一种口算游戏,其规则是将数字3、5、2、除号和等号随意排列组合,使其成为一个正确的数学等式。例如,3÷3+5×2=11就是一种正确的组合。这个问题的重难点在于理解运算符的优先级和顺序,以及如何正确地进行口算。 反馈 收藏 https://easylearn.baidu.com/edu-page/tiangong/questiondetail?id=1775114649195924639&fr=search
9.成语三下五除二意思解释当前位置:成语词典>>三下五除二的意思解释 成语三下五除二 发音:sān xià wǔ chú èr 释义:珠算口诀。形容做事及动作干脆利索。 出处: 示例: 近似成语:着三不着两张三李四攒三聚五再衰三竭再三再四自刽以下指日可下只听楼梯响,不见人下来正中下怀折节下士http://chengyu.98523.com/jieshi/%C8%FD%CF%C2%CE%E5%B3%FD%B6%FE.html
10.成语“三下五除二”的解释和评论【简拼】:sxwce成语故事 【基本解释】:珠算口诀。形容做事及动作干脆利索。 编辑 【出处】:老舍《赵子曰》第三:“他一鼓作气的坐起来,三下五除二的穿上衣服。”编辑 【示例】:他~地解决了问题。编辑 【近义词】:三下两下编辑 【反义词】:略编辑 【语法】:作状语、分句;指人做事编辑 【图片】:手机https://cy.pcccp.cn/cihui-82547942.html
11.《三下五除二》的解释三下五除二造句成语:三下五除二的意思https://chengyu.bmcx.com/sanxiawuchuer__chengyuchaxun/
12.三下五除二成语解释成语大全【三下五除二】_成语解释 【三下五除二】 【词语拼音】:sān xià wǔ chú èr 【词语意思】:珠算口诀。 形容做事及动作干脆利索。 【词语出处】:清· 文康《儿女英雄传》三六回:“便见他姊妹两个,三下五除二的不离手,五亩七分半的不离口。”https://rqxh.net/article/view.aspx?id=9594
13.三下五除二词语解释意思现代汉语词典三下五除二的词语解释、拼音、例句、近义词、反义词。http://m.46644.com/cidian/word/%C8%FD%CF%C2%CE%E5%B3%FD%B6%FE
14.“三下五除二”的意思“三下五除二”成语解释【成语】:三下五除二 【读音】:三(sān)下(xià)五(wǔ)除(chú)二(èr) 【拼音】:sān xià wǔ chú èr 【解释】:珠算口诀。形容做事及动作干脆利索。 半夜三更 避军三舍 避君三舍 冰冻三尺,非一日之寒 不成三瓦 不管三七二十一 不三不四 https://tool.httpcn.com/Html/Phrase/21/54845821043.shtml
15.三下五除二的成语解释意思出处成语大词典基本解释 词目:三下五除二 拼音:sān xià wǔ chú èr 注音:ㄙㄢㄒㄧㄚˋㄨˇㄔㄨˊㄦˋ 解释:珠算口诀。形容做事及动作干脆利索。 出处:老舍《赵子曰》第三:“他一鼓作气的坐起来,三下五除二的穿上衣服。” 英文:at one go 单字: 三 下 五 除 二 与三下五除二相关内容: http://www.esk365.com/chengyu/cyshow.asp?id=eb6ebheb7eb2eb4
16.三下五除二的意思拼音是什么成语解释造句近义词反义词【解释】: 珠算口诀。形容做事及动作干脆利索。 【出处】: 老舍《赵子曰》第三:“他一鼓作气的坐起来,三下五除二的穿上衣服。” 【举例造句】: 他三下五除二地解决了问题。 【拼音代码】: sxwe 【近义词】:三下两下 【反义词】: 【歇后语】: http://www.hydcd.com/cy/htm3/sx9343.htm
17.三下五除二意思成语解释三下五除二的意思 三下五除二: 发音:sān xià wǔ chú èr 释义:珠算口诀。形容做事及动作干脆利索。 出处: 示例: 查字义:三下五除二 复制网址 其他成语:三浴三衅三余读书https://bajiu.cn/chengyu/?id=21202
18.三下五除二的意思三下五除二造句读音解释在线成语词典网(zidian.98zw.com)提供成语三下五除二的意思及对应读音、三下五除二是什么意思、近义词、反义词、英语翻译、三下五除二造句等详细信息。访问地址:https://zidian.98zw.com/cy/sxwce.html 成语名称:三下五除二 成语读音:sān xià wǔ chú èr https://zidian.98zw.com/cy/sxwce.html
19.成语“三下五除二”的出处及解释三下五除二(sān xià wǔ chú èr)释义:珠算口诀。形容做事及动作干脆利索。https://www.wuduge.com/idiom/19109.html
20.三下五除二(十二生肖成语“二”)数字成语成语成语大全英文解释:at one go <neat and quick> 成语来源:清?文康《儿女英雄传》第36回:“偶然在家闲一刻,便见他姊妹两个‘三下五除二’的不离手,‘五亩七分半’的不离口。” 用法:作状语、分句;指人做事 成语造句举例:这点事情被他三下五除二的就做玩了。 http://www.cn0-6.com/topics/553/2010761458027814.html