.NET考题笔记(个人整理)

1..NET中类和结构的区别

类型上说:结构是值类型,值类型在栈上分配地址;类是引用类型,引用类型在堆上分配空间。栈的执行效率要比堆的执行效率高,栈资源有限,不适合处理大的逻辑复杂的对象,所以结构处理作为基类型小对象,而类处理商业逻辑。结构是值类型,所以结构之间的赋值可以创建新的结构;类是引用类型,类之间的赋值只是复制引用。结构和类的基类型都是对象object。从继承性上说,结构不能从另一结构或类继承,本身不能被继承,虽然结构没有明确的用sealed声明,但结构是隐式sealed的;类是完全可以扩展的,除非显式的声明为sealed,否则类可以继承其他类和接口,自身也可以被继承。注:结构可以继承接口。从内部结构上说:结构没有默认的构造函数,但可以添加构造函数,没有析构函数,没有abstract和sealed,不能有protected修饰符,可以不使用new初始化,在结构中初始化实例字段是错误的;类有默认的构造函数、析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。从类与结构的选择上说:栈的空间是有限,对大量的逻辑对象,创建类要比创建结构好些;在表现抽象和多级别的对象层次时,类是最好的选择;大多数情况下该类型只是一些数据时,结构是最好的选择。


2. UDP和TCP连接有和异同

TCP(Transmission Control Protocol)是传输控制协议,提供的是面向连接的,可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行TCP连接(三次握手)之后才能传输数据。TCP提供超时重拨,检验数据功能。

UDP(User Datagram Protocol)是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。


3. 面向对象的三大基本特性

封装,继承,多态。

封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承:继承是一种这样的功能,可以使用现有的类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承创建的新类成为子类或派生类,被继承的类称为父类或基类。继承的过程,就是一般到特殊的过程。要实现继承,可以通过“继承”和“组合”来实现。继承概念的实现方式有三类:实现继承、接口继承和可视继承。实现继承是指使用基类的属性和方法而无需额外的编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;可视继承是指子类使用基类的外观和实现代码的能力。在考虑使用继承的时候,需要注意的是两个类之间的关系应该是“属于”的关系。

多态:多态性是允许你将父对象设置成为和一个或更多的它的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是允许子类类型的指针赋值给父类类型的指针。实现多态,有两种方式,分别是覆盖和重载。覆盖,是指子类重新定义父类的虚函数的做法;重载,是指允许存在多个同名函数,而这些函数的参数列表是不同的。多态的作用是,实现代码和接口的重用,为了在类的继承和派生的时候,保证使用类族中任一类的实例的某一属性时的正确调用。


4. 值类型和引用类型的区别

C#中的每一种类型要么是值类型、要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。

(1)【分类】值类型有:预定义数据类型(基本数据类型)、结构和枚举;引用类型有:字符串、数组、自定义类、委托和接口等都属于引用类型。

(2)【继承】值类型继承自ValueType(System.ValueType又继承自System.Object);引用类型继承自Object。所有的值类型都是密封(seal)的,所以无法派生出新的值类型。引用类型可以派生出新的类型(类)。

(3)【存储】值类型的实例通常是分配在栈,属于静态分配,但是在某些情形下可以存储在堆中(如一个构造出来的类类型,其中包含有值类型的字段,那么该字段会和类实例保存在同一个地方,即堆中);而引用类型的对象总是分配在托管堆中,属于动态分配。需要注意的是:引用类型(局部变量)在栈中存储一个引用(指针、内存地址),其实际的存储位置是托管堆。为了方便,称引用类型部署在托管堆。值类型总是分配在它声明的地方,作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。

(4)【空值】引用类型可以包含null值,值类型不能。引用类型变量的赋值只复制对象的引用(指针或者说是内存地址),而不复制对象本身。而将一个值类型变量赋给另一个只类型变量时,将复制包含的值。

(5)【多态】值类型不支持多态性,而引用类型是支持多态性的。值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式。


5. 在.NET中所有类的基类

Object

值类型派生自System.ValueType,而该类的基类又是Object。


6. 写出一个SQL语句,取出A表中第30行到第40行的记录

select  top 10  *  from  A  where  id  not  in (select  top  30 id  from  A )


7. ADO.NET中常用的对象

Connection 数据库连接对象:ADO.NET中使用的第一个对象,用于其它ADO.NET对象之前,提供了到数据源的基本连接

Command 数据库命令对象:此对象向数据库发出命令,表示要对数据库执行一个SQL命令语句或一个存储过程

DataSet对象:是ADO.NET的中心概念,表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表(DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。DataSet 数据对象:此对象表示一组相关表,在应用程序中这些表作为一个单元来引用。

DataAdapter对象:这是一个通用的类,可以执行针对数据源的各种操作,该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等。

DataReader对象是一个简单的数据集,用于从数据源中检索只读数据集,常用于检索大量数据。DataReader对象只允许以只读、顺向的方式查看其中所存储的数据,提供一个非常有效率的数据查看模式,同时DataReader对象还是一种非常节省资源的数据对象。


8.  用最有效的方法算出2乘以8结果

2<<3(将2向左移3位)


9.  ASP.NET页面之间传递值的方式

(1)QueryString 这是一种非常简单的传值方式,可以将传送的值显示在浏览器的地址栏中;如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法;但是对于传递数组或对象的话,就不能用这个方法了。

优点:使用简单,对于安全性要求不高时传递数字或是文本值非常有效。

缺点:缺乏安全性,由于它的值暴露在浏览器URL地址中,并且不能传递对象。

使用方法:在源页面将需要传递的名称和值构造URL地址,代码用Response.Redirect(URL)重定向到上面的URL地址中,在目的页面使用Request.QueryString["name"]取出URL地址中传递的值。

(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e) 
{ 
  string s_url; 
  s_url = "b.aspx?name=" + Label1.Text; 
  Response.Redirect(s_url); 
}

  (2)b.aspx

private void Page_Load(object sender, EventArgs e) 
{ 
  Label2.Text = Request.QueryString["name"]; 
}

(2)session 这是使用中最常见的用法了,操作与Application类似,作用于用户个人,过量的存储会导致服务器内存资源的耗尽。

优点:使用简单,不仅能传递简单数据类型,还能传递对象,数据量的大小不受限制。

缺点:在Session变量存储大量的数据会消耗较多的服务器资源,容易丢失。

使用方法:在源页面的代码中创建你需要传递的名称和值构造Session变量:Session["name"] = "Value(Or Object)",接着在目的页面代码中使用Session变量取出传递的值,Result=Session["name"]。

注意:Session不用时可以销毁它,销毁的方法是,清除一个:Session.Remove("session名“);清除所有:Session.Clear()。

(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e) 
{ 
  Session["name"] = Label.Text; 
}

  (2)b.aspx

private void Page_Load(object sender, EventArgs e) 
{ 
  string name; 
  name = Session["name"].ToString(); 
}

(3)cookies 这个也是常用的方法。Cookie用于在用户浏览器上存储小块的信息,保存用户相关的信息。比如用户访问某网站时的用户ID,用户偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转成字符串的形式。与Session一样,其实是对于每个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而Session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。

优点:使用简单,是保持用户状态的一种非常有用的方法。比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。

缺点:常常被人认为用来收集用户隐私而遭到批评;安全性不高,容易伪造。

使用方法:在源页面的代码中创建需要传递的名称和值构造Cookie对象,接着在目的页面使用Cookie对象取出传递的值

(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e)
{
  HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
  Response.Cookies.Add(objCookie); 
}

  (2)b.aspx

string myName1Value;
myName1Value = Request.Cookies[ "myCookie" ].Value;

(4)application  该对象的作用范围是整个全局的,也就是说对所有的用户都有效。它在整个应用程的生命周期都是有效的,类似于全局变量一样,所以可以在不同的页面中对它进行存取。它和Session变量的区别在于,前者是所有用户共用的全局变量,后者是用户独有的全局变量。

优点:使用简单,消耗较少的服务器资源,不仅能传递简单数据,还可以传递对象,数据量的大小不受限制。

缺点:作为全局变量容易被误操作,所以单个用户使用的变量一般不能使用application。

使用方法:在源页面的代码中创建需要传递的名称和值构造Application变量Application["name"] = "Value(Or Object)",在目的页面代码中使用Application变量取出传递的值Result=Application["name"]。

注意:常用lock和unlock方法来锁定和解锁,为了防止并发修改。

(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e) 
{ 
  Application["name"] = Label1.Text; 
}

  (2)b.aspx

private void Page_Load(object sender, EventArgs e) 
{ 
  string name; 
  Application.Lock(); 
  name = Application["name"].ToString(); 
  Application.UnLock(); 
}
(5)server.Transfer 这个才可以说是面向对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面向对象的,简洁有效。

Server.Transfer是从当前的Aspx页面转到新的Aspx页面,服务器端执行新页面并输出,在新页面中通过Context.Handler来获得前一个页面传递的各种数据类型的值、表单数据、QueryString。由于重定向完全在服务器端完成,所以客户端浏览器中的URL地址是不会改变的。调用Server.Transfer时,当前的Aspx页面终止执行,执行流程转入另一个Aspx页面,但是新的Aspx页面仍使用前一个Aspx页面创建的应答流。

优点:直接在服务器端重定向,使用简单方便,减少了客服端对服务器端提出请求;可以传递各种数据类型的值和控件的值。

缺点:客户端浏览器中URL地址是不会改变的,会导致在新的页面可能会出现一些意想不到的问题。比如:如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。

使用方法:在源页面汇总使用Page类的Server.Transfer跳转到另一个页面传递页面数据:Server.Transfer("b.aspx","false"),在目的页面中使用Context.Handler来接收数据:FormerPage formerPage=(FormerPage)Context.Handler,然后用formerPage的属性和方法来获取前一个页面的值,或者直接用Context.Items[”myParameters“]

(1)a.aspx

public string Name 
{ 
  get{ return Label1.Text;} 
} 
private void Button1_Click(object sender, System.EventArgs e) 
{ 
  Server.Transfer("b.aspx"); 
}

    (2)b.aspx

private void Page_Load(object sender, EventArgs e) 
{ 
  a newWeb; //实例a窗体 
  newWeb = (source)Context.Handler; 
  string name; 
  name = newWeb.Name; 
}


10. ASP.NET中的身份验证方式

用户登录的过程,在ASP.NET叫做身份验证

ASP.NET提供了3 种身份认证方式:windows身份验证、Forms验证和Passport验证。

windows身份验证:IIS根据应用程序的设置执行身份验证,要使用这种验证方式,在IIS中必须禁用匿名访问。

Forms验证:用Cookie[其他信息也是可以的,例如Session类]来保存用户凭证,并将未经身份验证的用户重定向到自定义的登陆页面。FormsAuthentication类,内置的表单验证相关类。Request.IsAuthenticated与HttpContext.User.Identity.Name。

FormsAuthentication.SetAuthCookie和FormsAuthentication.SignOut()。

Passport验证:通过Microsoft的集中身份验证服务执行,他为成员站点提供了单独登陆和核心配置文件服务。


11. C#语言中const和readonly关键字

const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值,是静态常量。

readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量,属于动态常量。

const常量除了可以声明为类字段之外,还可以声明为方法中的局部变量,默认为静态类型(是无需static修饰,否则编译出错),但必须在声明的同时完成初始化。

readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。

由于const常量在编译时就被替换成字面量,使得其取值类型受到了一定的限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。这句代码无法通过编译:public const DateTime D = DateTime.MinValue;(改成readonly后就可以正常编译)

readonly的可维护性较const高。const直接以字面量形式参与运算,性能略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。

适用场景:取值永久不变(一些常量,如圆周率、一天的秒数等),对程序性能要求高,这时适用const,其余的优先使用readonlyconst修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化 ,const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。


12. 在.NET中的一些常用的概念名词

XML:Extensible Markup Language 可扩展标记语言

SOAP:Simple Object Access Protocol 简单对象访问协议

CTS:Common Type System  通用类型系统

CLR:Common Language Runtime 公共语言运行时

CLS:Common Language Specification 公共语言规范

CLI:Common Language Infrastructure 公共语言基础结构

CTS:Common Type System  通用类型系统

JIT:Just-in-time  运行时

GAC:Global Assembly Cache全局程序集缓存


13. SQL SERVER中索引类型包括的三种类型

唯一索引、主键索引、聚集索引


14. foreach遍历访问的对象需要实现 的接口或声明方法的类型

IEnumerable 、 GetEnumerator


15. 设计模式

设计模式分为三种类型,共23类。
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。


16.private、protected、public和internal修饰符访问权限

private:私有成员,在类的内部才可以访问;

protected:保护成员,在类的内部和继承类中可以访问;

public:公有成员,完全公开,没有限制;

internal:内部成员,在同一命名空间中可以访问。


17.C#委托

C#中的委托实质上是一种类,一种特殊的类,可以用来声明一个函数变量的类。委托可以理解为是函数的引用。C#的委托使得可以将方法作为一个参数传递给另外一个方法。事件属于委托。


18.方法重载和override的区别

方法重载指的是方法名称相同,但各个重载方法的参数类型或者参数个数不同;而override是为了在派生类中重写基类的方法,实现多态。方法重载可以看成是”横向重载“,重写基类方法 可以看成是 ”纵向重载“。


19.this关键字的作用

a.用于类的实例成员、构造函数和属性中,作用是区分成员名和参数。

b.用于表示当前对象,可以把它当做实参传递到其他方法。

c.用于声明类的索引器。索引器可以重载,并且可以是多个参数,参数的数据类型不受限制。

需要注意的是:this关键字不能用于类中的静态成员。


20.三层架构

就是将整个业务系统分为表示层、业务逻辑层和数据访问层,区分的目的是实现“高内聚低耦合”。

a.表示层(Presentation Layer)通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得

b.业务逻辑层(Business Logic Layer)针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理

c.数据访问层(Data Access Layer)层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。


21.MVC框架模式

Model-View-Controller,模型-视图-控制器


22.装箱和拆箱

装箱是将值类型对象转换成引用类型对象的隐式转化,而拆箱是将引用类型对象转换成值类型对象显示转换。

.net中有值类型和引用类型,与之对应的是内存分配有两种:栈和堆(托管堆)。值类型分配在栈区,引用类型分配在栈区和托管堆,托管堆对应.net中的垃圾回收。

装箱,是方法实现中为了适应更加多的数据类型,保证方法更加通用。

第一步:为这个值类型新增加一个托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)

第二步:将值类型的实例字段拷贝到这个新开辟的托管内存中

第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。

装箱时生成一个全新的引用对象,会有一个时间上的损耗,这也造成了效率降低。

拆箱,检查对象实例,确保它是一个给定类型的装箱值,将该值从实例复制到值类型变量中。

第一步:首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。

第二步:将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。

另外:在栈区分配内存要比在堆上分配内存快得多。


23.理解OOP思想

OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。
周围的事物都可以看成是对象,都具有自身的属性和方法,通过这些属性和方法可以区分出不同的事物。
属性和方法的集合就形成了类,类是面向对象编程的核心和基础,通过类就将零散的用于实现某个功能的代码有效地管理起来了。
类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,类在实例化之后就是对象。
1. 封装性:
也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,也能有效避免程序间相互依赖,实现代码模块间松藕合。
2. 继承性:
就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
3. 多态性:
子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。
于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。


24. .NET中的垃圾回收

垃圾回收(garbage collection)在.NET FRAMEWORK中是一个非常重要的机制。

在C++中,需要程序员自己去管理内存,包括内存申请和释放,如果对不使用的资源进行及时的释放就会出现内存泄露;而在.net中,就不再需要程序员自己来管理内存方面的事了,有了垃圾回收机制替我们完成这些功能。CLR里面的垃圾回收机制用一定的算法判断某些内存程序不再使用,回收这些内存并交给我们的程序再使用。

在.NET FRAMEWORK中,内存中的资源分为“托管资源”和“非托管资源"。托管资源必须接受.NET FRAMEWORK的CLR(公共语言运行时)的管理(譬如类型安全检查);而非托管资源不需要接受CLR的管理。托管资源在.NET FRAMEWORK中又分别存在于两个地方:”栈区“和”托管堆“,规则是:所以的值类型和引用类型的引用都存在”栈区“中,而所有的引用代表的对象实例是存在于”托管堆“的。在C#中,释放托管资源可以通过”垃圾回收器“自动完成,垃圾回收是.NET FRAMEWORK的机制特性。

垃圾回收的功能:a.用来管理托管资源和非托管资源的所占用的内存分配和释放;b.寻找不再使用的对象,释放其所占用的内存,以及非托管资源所占用的内存;c.垃圾回收器释放内存后,出现内存碎片,垃圾回收器移动一些对象,以得到整块的内存同时所有的对象引用都将被调整为指向对象新的存储位置。
托管堆和托管栈
.net CLR在运行我们的程序时,在内存中开辟了两块地方作不同的用处--托管栈和托管堆. 托管栈用来存放局部变量, 跟踪程序调用与返回. 托管堆用来存放引用类型. 引用类型总是存放于托管堆. 值类型通常是放在托管栈上面的. 如果一个值类型是一个引用类型的一部分,则此值类型随该引用类型存放于托管堆中。

.NET中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。


25. 软件开发一般分为五个阶段
(1)问题的定义及规划
此阶段是软件开发与需求共同讨论,主要确定软件的开发目标及其可行性。
(2)需求分析
在确定软件开发可行性的情况下,对软件需要实现的各个功能进行详细需求分析。需求分析阶段是一个很重要的阶段,这一阶段做的好,将为整个软件项目的开发打下良好的基础。“唯一不变的是变化本身”,同样软件需求也是在软件开发过程中不断变化和深入的,因此,我们必须定制需求变更计划来应付这种变化,以保护整个项目的正常进行。
(3)软件设计
此阶段中偶要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计、数据库设计等。软件设计一般分为总体设计和详细设计。还的软件设计将为软件程序编写打下良好的基础。
(4)程序编码
此阶段是将软件设计的结果转化为计算机可运行的程序代码。在程序编码中必定要制定统一、符合标准的编写规范。以保证程序的可读性、易维护性。提高程序的运行效率。
(5)软件测试
在软件设计完成之后要进行严密的测试,一发现软件在整个软件设计过程中存在的问题并加以纠正。整个测试阶段分为单元测试、组装测试、系统测试三个阶段进行。测试方法主要有白盒测试和黑盒测试。


26. 向服务器发送请求的方式
Post  和 Get


27.白盒测试和黑盒测试

白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,被测试的软件就是”盒子“,白盒指的是盒子是可视的,你清楚的盒子内部的东西以及里面是如何运作的。”白盒“法全面了解程序内部逻辑结构、对所有的逻辑路径进行测试。优点:迫使测试人员去仔细思考软件的实现,可以检测代码中每条分支和路径,揭示隐藏在代码中的错误,对代码的测试比较彻底和最优化。缺点是:昂贵,无法检测代码中遗漏的路径和数据敏感性错误,不能验证规格的正确性。

黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看做一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能的进行测试。黑盒测试是站在用户的角度,从输入数据与输出数据的对应关系出发进行测试的。优点:基本上不用人管着,如果程序停止运行了一般就是被测试程序crash(在计算机系统压力或性能测试过程中,有时出现因某种原因宕机,或主机、程序停止工作等情况),设计完测试用例之后,下来的工作就轻松很多,但在确定crash中较为麻烦。缺点:结果取决于测试用例的设计,测试用例的设计部分优势来源于经验,没有状态转换的概念,寻找crash较困难。


28. SQL注入,如何防止

通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
防止SQL注入的方法有:对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双“-“进行转换等;不要使用动态的拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据库查询存取;不雅使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接;加密或者hash掉密码和敏感信息;应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。


29.分布式应用

分布式应用指的是应用程序分布在不同计算机上,通过网络来共同完成一项计算任务的工作方式。通常为服务器/客户端模式。


30. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
int[] intArr=new int[100];
ArrayList mylist=new ArrayList();
Random rnd=new Random();
while(mylist.Count<100)
{
    int num=rnd.next(1,101);
    if(!mylist.Contains(num))
    {
        mylist.Add(num);
    }
}
for(int i=0;i<100;i++)
{
     intArray[i]=mylist[i];
}



14. ASP.NET页面跳转的几种方式

(1)Response.redirect:这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但它可以跳转到任何页面,没有站点页面的限制,同时不能跳过登陆保护。但速度慢是其最大的缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求导服务器端。需要注意的是跳转后内部空间波爱吃的所有数据信息将会丢失,所以需要使用到session。

(2)Server.Transfer:这个跳转的方式优势是速度快,只需要postback一次,它必须是在同一个站点下,因为它是Server的一个方法。另外,它能跳过登陆保护。这个方式的重定向请求是发生在服务器端,所以浏览器的url地址仍然保留在原页面上的地址。

(3)Server.execute:这个方法主要是用在页面设计上面,而且它必须是跳转到同一站点下的页面。这个方法是需要将一个页面的输出结果插入到另一个aspx页面的时候使用。

总结:
当需要把用户跳转到另一台服务器上的页面的时候使用redirect,跳转到非aspx页面时候,如html,使用redirect,需要把查询字符串作为url一部分的时候保留传给服务器的时候,因为其他2种方法不能做到2次postback,把数据先带回服务器使用redirect;
需要aspx页面间的转换(不涉及登录) 使用transfer
当需要把aspx页面的输出结果插入到另一个aspx页面的时候使用   execute方法。
在需要用户来决定什么时候跳转页面,就使用超链接。





17. 中间语言(IL)及其的作用
代码在执行前都要被编译为托管代码,与CPU无关的指令集。
其作用:支持平台无关性,还支持语言的互操作性。




19.数据库事务

事务就是对数据执行的一组操作,这些操作将数据从一种状态更改为另一种状态,它们必须是一个单元运行。事务最主要的功能是确保多个连续的操作必须全部执行成功,否则返回到未执行任何数据操作的最初状态。事务有两种状态,一个是提交,一个是回滚。事务的四种属性(ACID):原子性、一致性、隔离性和持久性。










24. 类型转换Convert、Parase和TryParase的区别
范例:Convert.ToInt32、int32.Paraseint32.TryParase都是将类型转换成int,但它们存在区别
Convert.ToInt32与int.Parase较为类似,实际上Convert.ToInt32内部调用了int.Parase
Convert.ToInt32参数为null时,返回0;int.Parase参数为null时,抛出异常。
Convert.ToInt32参数为""时,抛出异常;int.Parase参数为“”时,抛出异常。
Convert.ToInt32可以转换的类型较多;int.Parase只能转换字符型字符串。
Int.TryParase与Int.Parase又较为类似,但它不会抛出异常,转换成功返回true,转换失败返回false。最后一个参数为输出值,如果转换失败,输出值为0



27. Error和Exception区别

Error表示恢复不是不可能,但是很困难下的一种严重问题。比如说内存溢出的问题。不可能指望程序能处理这样的情况。

Exception表示是一种设计或实现的问题。也就是说,它表示如果程序正常运行,从不发生的情况。

猜你喜欢

转载自blog.csdn.net/szzhuyike/article/details/44097597