题目总结(2014-1-10)

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

1> QueryString方式,.aspx?id=1;

2> Resopnse.Redirect,两次Http请求,浏览器中地址有变化;

3> Server.Transfer,一次Http请求,浏览器中地址无变化,执行完后不在执行后续代码;

4> Server.Excute,一次Http请求,浏览器中地址无变化,执行完后接着执行后续代码;和执行一个函数类似;

5> Session,存储在服务器端;sqlserver,IIS进程,用户自定义程序;

6> Cookie,存储在客户端;

7> Application,他是全局的,所有会话中的用户都是一样的值;

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

 委托是一种可以把方法作为函数参数的传入到两一个函数中的机制。

 和C++中的函数指针类似,但是不完全一样:

  • 函数指针只存储着一个函数的地址;
  • 而委托则包含_target(为null或者执行方法所属的对象实例),_methodPtr(方法的地址),_prev(委托链中,当前委托的下一个委托);

委托和事件没有可比性,因为委托是一种类型,时间是一个对象,类型和对象无法比较,但是他们从别的角度还有些相似。

下面说的是委托对象(用委托方式实现的事件)和(标准event方式实现)事件的区别:事件的内部是用委托实现的,因为对于事件来说,外部只能注册自己+=,注销自己-=,外界不能注销其他的注册者,外界不可以主动触发事件,因为如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来严格委托实例的。事件只能add,remove自己,不能赋值。事件值能+=,-=,不能=。

事件内部就是一个private的委托和add、remove两个方法:

平时多用Reflector,ILDasm,查看.Net类的内部实现,解决问题。

3.override和overload的区别

 重载overload是方法的名称相同,参数或参数类型不同,进行多次重载以适应不同的需求,这也是面向对象中多态的一个体现方面。

 重写override是对基类中的虚方法就行重写,override是面向对象的概念。

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

参数的个数和类型都是任意的。索引器的内部本质就是set_Item, get_Item方法。和属性类似(get_property,set_property方法)。

 

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

 属性可以对设值和取值进行非法控制,或进行需求控制。属性实际上是两个方法:get方法,set方法,可以在方法里做需要的逻辑,所以当然get进去的值不一定就是set进去的值。

属性和public字段相比具有代码优美,功能更完美,操作性更强 等特点。

6.三层架构

三层架构就是将整个业务应用划分为:

  • 表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候所见所得;
  • 业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作。对数据业务逻辑处理;
  • 数据访问层(DAL):该层所做事务直接操作数据库,针对数据的添加,删除,修改,查找等,每层之间是一种垂直的关系。

一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的一起变化;

有点:分工明确,条理清晰,易于调试,可扩展性好;

缺点:增加成本。

7. MVC模式

MVC(Model View Controller)模型-视图-控制器。

aspx就是view 视图;

Model:dataset,Reader,对象;

Controller:cs代码。

MVC是典型的平行关系,没有说谁在上谁在下的关系。

模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。它强制性的使用程序的输入,处理和输出单位分开。

MVC最大的好处是将逻辑和页面的分离。

8.什么是装箱(boxing)和拆箱(unboxing)?

装箱:从值类型到引用类型的转换;

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

9.什么是应用程序域(App Domain)?

一种边界,他由公共语言库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。

应用程序域有助于将在一个应用程序中创建的对象与其他应用程序中创建的对象隔离,已使运行时行为可以预知。

在一个单独的进程中可以存在多个应用程序域,应用程序域可以理解为一种轻量级的进程,起到安全的作用,占用资源小。

10.CTS,CLS,CLR分别作何解释?

CTS:公共类型系统(Common Type System)Int32,Int16->int, String->string, Boolean->bool;

CLS:通用语言规范(Common Language Specification);

CLR:公共语言运行时(Common Language Runtime),通俗的理解为.Net提供的那些类库;

11.在.Net中Class和Struct有什么异同?

class是引用类型,而struct为值类型;

struct里的字段不能在声明的时候就初始化(不能包含值);如果包含构造函数的话,构造函数不能没有参数;

struct既然是值类型,那就意味着访问速度要比class要快,当我们需要存储数据的时候,要选择用struct;如果设计一个类型的时候,涉及到复杂的操作,就选用class

Struct不能派生出其他新的类型,但是可以实现接口。class可以派生出新的类型。

补充:Int32,和Boolean都属于结构体struct。

12.堆和栈有什么区别?

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

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

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

实现IEnumerable接口 或 声明GetEnumerator方法的类型;

14.GC是什么?为什么要有GC?

GC是(Garbage Collect)垃圾回收器。

程序员不用担心内存管理,因为垃圾回收器会自动进行管理。GC只能处理托管堆中内存资源的释放,对于非托管资源不能使用GC来护手,必须由程序员手工回收,比如:FileStream,SqlConnection,网络连接,或操作系统的资源,都需要程序员调用Dispose进行资源的回收。

要请求垃圾回收器,可以调用方法:GC.Collection(),一般不需要手动调用。

15.String s = new String("xyz");创建了几个String Object?

这句代码无法通过编译,因此也没法回答创建了几个对象。

补充回答:字符串池,Inter,IsIntered

16.值类型和引用类型的区别?

  • 将一个值类型变量赋值给另一个值类型变量时,将赋值包含的值。引用类型变形的赋值只复制对象的引用,而不是赋值对象本身;
  • 值类型不可能派生出新的类型:所有值类型均隐式派生自System.ValueType;但struct可以实现接口;
  • 值类型不能被赋值为null,然而,可空类型功能允许将null赋值给值类型;(int? i = null);
  • 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值;而引用类型默认为null;
  • 值类型分配在堆栈上,而引用类型分配在托管堆中;
  • 值类型访问速度较快;

17.C#中的接口和class有什么异同?

接口Interface是一组契约,不能包含具体的字段,接口中定义的方法只能包含方法声明,不能包含方法体;同属性;

具体:

不同点:

  • 不能直接实例化接口;
  • 接口不包含方法的实现,只包含方法的声明;
  • 一个类可以实现多个接口,但只能继承一个基类;
  • 类定义可以在不同的源文件之间进行拆分(关键字:partial);

相同点:

  • 接口,class,Struct都可以从多个接口继承;(更确切的说类是实现接口,而不是继承);
  • 接口类似于抽象基类:继承接口的任何非抽象类型都必须要实现接口的所有成员,如果是抽象类继承接口的话,可以将继承自的方法映射到一个抽象方法中;
  • 接口和类都可以包含 事件,方法,索引器,属性

18.abstract class和interface有什么区别?

相同点:都不能被直接实例化,都可以通过继承实现其抽象方法;

不同点:

  • 接口支持多继承,抽象类仅支持单继承;
  • 接口只能定义行为,抽象类既可以定义行为,还可以提供实现;
  • 接口可以用于支持回调(CallBack),抽象类不能实现回调,因为继承不支持。
  • 接口只包含Method,Property,Index,event的签名,但不能定义字段和包含实现的方法;抽象类可以定义Field,Property,包含Method的实现;
  • 接口可以作用于值类型和引用类型;抽象类不能作用于引用类型。例如:Struct可以实现接口,而类不能;

19.是否可以继承String类?

不能。因为String类是Sealed的。

 20.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行?会执行,在return 前执行。

 例子:

public int QueryCount()
{
…..
   try
   {
      return cmd.ExecuteScalar();
   }
   finally
   {
     cmd.Dispose();
   }
}

先执行cmd.ExecuteScalar(),然后执行finally里的代码,最后执行return;

21.new 关键字用法(*)

  • 运算符: 实例化对象,和调用构造函数的时候用到;
  • 修饰符: 用于向基类成员隐藏继承成员;
  • 约束: 泛型声明中用于对泛型参数的约束,约束用作类型参数的参数的类型;

22.如何把Array复制到ArrayList里(*)

 实现1: string[] s={"123","456"};

            ArrayList list=new ArrayList(); 

            list.AddRange(s);

实现2: 

           string[] s={"123","456"};

            ArrayList list=new ArrayList(s); 

23. 进程和线程的区别?

进程是程序运行的一次实例,是系统进行资源分配和调度的一个独立单位。

线程则是CPU分配和调度的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

线程Thread和进程Process二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码堆栈和执行上下文的边界。

一个进程中可以包含多个线程,同时创建多个线程来完成某项任务,便是多线程。

而同一进程中的不同线程共享代码和数据空间。

24.什么是强类型,什么是弱类型?哪种更好些?为什么?

强类型是在编译的时候就确定了类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。

两者各自有优缺点:强类型安全,因为它事先已经确定好了,而且效率高。弱类型更灵活,但是效率低,而且出错概率高。

一般用于编译型语言,如C++,java,pascal,C#等;弱类型相比而言不安全,在运行的时候容易出现错误,但它更灵活,多用于解释型编程语言,如javascript,vb等。

举例:强类型DataSet,Dataset中的定义的Column都是确定的类型,不在是弱类型Dataset中的Object,不需要来回的转化,效率相对较高。

25.什么是反射?

反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,他的显示依托于元数据。

元数据是存储在PE(Portable Execute,如:exe,DLL,COM)文件中的数据库,他详细记录了程序集或模块内部的结构、引用类型、程序集和清单。

(元数据表:定义表,引用表,清单表。)

另解:

程序集包含模块,模块又包含类型,类型下有成员,反射就是管理程序集、模块、类型的对象。它能够动态的创建类型的实例,设置现有对象的类型或获取现有对象的类型,能够调用类型的方法和访问类型的字段属性,他是在运行时创建和使用的类型实例。

26.、int、DateTime、string是否可以为null?

int,DateTime不能,因为他们是Struct类型,而Struct属于值类型,值类型不能为null。只有引用类型才能被赋值为NULL,string是引用类型,所以可以为NULL。

然后,可空类型功能允许将null赋值给值类型: int? i = null。

27.using关键字有什么用?什么是IDisposable?

 using可以声明命名空间的引入,还可以实现非托管资源的释放,实现了IDisposable的类在using中创建,using结束后会自动调用该对象中的Dispose方法,释放资源。

using其实等价于:try.......finally,但使用起来更方便。

int? --> Nullable<int>。

28.Assembly.Load("foo.dll"); 这句话是否正确?(*)

  错误,无法通过编译。

  应该是:Assembly.Load("foo"); 或者Assembly.LoadFrom("fool.dll");

29.XML和HTML的主要区别?

XML(Extensible Markup Language)是可扩展标记语言。

HTML(Hypertext Markuo Language)是超文本传输标记语言。

  • XML是区分大小写字母的,HTML不区分。
  • XML有着严格的语法,有开始标记,就必须有结束标记;HTML语法则无此严格限制;XML中属性值必须装在引号中,HTML可以不用引号;HTML中可以拥有不带值的属性名,XML中不允许;
  • 用途不同:XML用来存储和传输数据;HTML用来显示数据;

30.string str = null 与string str = “”说明其中的区别。

 string str=null是不给他分配内存空间,而string str = "",是给他分配长度为空字符串的内存空间。String str = String.Empty和”“是一样的。

 null没有string对象,”“是有一个字符串对象。

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

方法一:

    Select top 10 * 

           from A

    where Id not in (select top 30 id fron A)

方法二:

         select top 10 *

    from A

   where id > (select max(id) from (select top 30 id from A) AS A1)

方法三:  

WITH [T] AS (

SELECT *,ROW_NUMBER() OVER (ORDER BY [id]) AS [RowID]
FROM A

)

SELECT *
From [T]
WHERE RowID>30 AND RowID<41

32.面向对象的语言具有什么样的特性?

封装性,继承性,多态性。

33.在.Net中所有可序列化的类都标记为?

[Serializable]

34.在.Net托管代码中我们不用担心内存漏洞,这是因为有了什么?

GC。

35.什么叫应用程序域?什么是受托管的代码?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?

    应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。

   

   受管制的代码:在.Net环境中运行的任何代码都是受管制的代码(managed code),.Net外部的代码也运行在windows上,这些代码称为为受管制的代码(unmanaged code)。

   

   托管代码:使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有很多优点:跨语言集成,跨语言异常处理,增强的安全性,版本控制和部署支持、简化的组件交互模型、调试和分析服务等。

 强类型系统:强类型语言是能够禁止任何违反类型系统的代码的语言,或者说是能够捕获所有违反类型系统的错误的语言。我们说C++相对于C是强类型的,是因为C++禁止了一些C中的隐式转换,比如将void*转换为任意的指针类型。

    重载:每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(参数的个数、顺序和类型)组成。只要签名不同,就可以在一个类型内定义具有相同名称的多种方法。当定义了两种或多种具有相同名称的方法时,就称为重载。

    CTS(通用类型系统):一种确定公共语言库如何定义、使用和管理类型的规范。

    CLR(公共语言运行时):.Net Framework提供了一个称为公共语言运行库的运行时环境,他运行代码并且提供使开发过程更轻松的服务。

    CLS(公共语言规范):要和其他对象完全交互,而不管这些对象是以何种语言实现的,对象必须只向调用方公开哪些他们必须与之交互的所有语言的通用功能。为此定了公共语言规范,他是许多应用程序所需的一套基本语言功能。

 36.什么是Code-Behind技术?

  就是代码隐藏,在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于应用程序的创建。

  比如分工,美工和编程的可以各干各的的,不用再像以前的asp那样代码和html代码都混在一起,难以维护。

37.接口是一种引用类型,在接口中可以声明(a),但不可以声明公有的域或私有的成员。

   a. 属性、方法、事件,索引器   b 方法和字段  c 索引器和字段  d事件和字段

38.在ADO.NET 中, 对于Command 对象的ExecuteNonQuery() 方法和ExecuteReader()方法,下面叙述错误的是(c)

  a) insert、update、delete 等操作的Sql 语句主要用ExecuteNonQuery()方法来执行;
  b) ExecuteNonQuery()方法返回执行Sql 语句所影响的行数。
  c) Select 操作的Sql 语句只能由ExecuteReader()方法来执行;
  d) ExecuteReader()方法返回一个DataReder 对象;

     ExecuteScalar→只返回结果集中的第一行第一列(调用者需要判断是否为null或者DBNull);

39. 下列关于C#中索引器理解正确的是(c )

  a) 索引器的参数必须是两个或两个以上
  b) 索引器的参数类型必须是整数型
  c) 索引器没有名字(使用了关键字this)
  d) 以上皆非

   

 40.StringBuilder和String的区别?

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

如果要操作一个不断增长的字符串,尽量不要用String类,改用StringBuilder类。

两个类的工作原理不同:String类是一种传统的修改字符串的方式,他确实可以完成把一个字符串添加到两一个字符串的工作没错,但在.Net框架下,这个操作不是很划算。因为系统显示把两个字符串写入内存,然后创建了一个String对象,并且读取内存中的数据复制给该对象,这样一来二去,耗费了不少资源。而是用StringBuilder(SYstem.Text)就不这样了,它提供了Append和AppendFormat方法,能在已有对象的原地进行字符串的修改,简单而且直接。当日内,一般情况下觉察不用到两者效率的差异,但如果要对某个字符串进行大龄的添加操作,那么StringBuilder类所耗费的资源和String类简直不是一个数量级的。

41.请叙述属性与索引器的区别。

  索引器可以看成是带参数的属性。索引器使类可以像使用数组一样。

42.请叙述const与readonly的区别。(*)

  const关键字用于字段或局部变量的声明,他指定字段或局部变量的值不能被修改。常量申明引入给定类型的一个或多个常数。const数据成员的声明必须包含初始值,且初始值必须是一个常量表达式,因为他在编译时需要完全评估。const成员可以使用另一个const成员来初始化,前提是两者没有循环依赖。

  readonly在运行期评估赋值,使我们得以在确保制度访问的前提下,把object的初始化动作推迟到运行期间进行。

  readonly和const不同:

  • const字段只能在该字段声明中初始化,readonly字段可以在声明或构造函数中初始化;因此根据所使用的构造函数,readonly字段可能具有不同的值;
  • const字段是编译时常数,而readonly字段则是用于运行时常数;
  • readonly只能在声明时或构造函数里初始化,并且不能在static修饰的构造函数里面;

43.什么是viewstate,能否禁用?是否所用控件都可以禁用?

viewstate是保存状态的一种机制,EnableViewState属性设置为false即可禁用。

44.对webservice的理解?

如果自己写的一些程序也希望别人可以通过web服务来使用,那就可以使用webservice。webservice具有夸平台的特性,调用方无需关注提供服务方是用何种代码实现;

SOAP是webservice的基础。WSDL是webservice描述语言,详细描述了webservice中提供服务所需提供的参数,以及参数类型,获得结果的类型等。

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

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

在定义接口中不能有方法体,也不能包含虚方法。

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

46.DataSet和DataReader的异同?

DataReader使用时始终占着SqlConnection,在线操作数据库,每次只在内存中加载一条数据,所以占用的内存是很小的,是只进的,只读的。

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

DataSet将数据全部加载到内存中,所以内存消耗比较大,但是却比DataReader更灵活们可以动态的添加行,列,数据,对数据进行回传更新操作。

47.public static const int A = 1,有什么错误?

const不能被static修饰;因为定义为常量后的就是静态的了,需要通过类名直接访问。

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

value,他的类型和属性所声明的类型相同。

49.C#支持多重继承么?
类之间不支持,接口之间支持。类对接口严格的说叫实现,不是继承。

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

System.Object。但是也并非所有的对象基类都是System.Object,利用工具ILDASM将生成的代码基类去掉,然后在编译成dll,这个DLL里的对象就不是以Object为基类。

可以编写不继承任何类型的类型。

51.通过超链接怎样传递中文参数?

用URL(统一资源定位器Uniform Resource Locator)编码。通过QueryString传递,用UrlEncode编码,用UrlDeCode解码。

52.string、String;int、Int32;Boolean、bool的区别

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

53.Server.Transfer和Response.Redirect 的区别是什么?

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

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

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

之间经过了两次交互。

54.不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?

String是不可变的,在这段代码中,s原先指向了一个String对象,内容是”abc“,然后我们将s指向”123“,那么s所指向的那个对象是否发生了改变呢?

答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容是”123“,原来那个对象还存在于内存中,只是s这个引用变量不在指向他了。

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

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

56. .Net中会存在内存泄漏吗,请简单描述。

  内存泄露就是指一个不再被程序使用的对象或变量一直占据着内存,得不到释放。.Net中有垃圾回收机制,他可以保证对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清楚。虽然.Net可以回收无用的对象,但是.Net仍然存在由于使用不当导致的内存泄露问题。

  .Net中内存泄露的情况:长声明周期的对象持有短声明周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有他的引用而导致不能被回收,这就是.Net中内存泄露的发生场景。

  通俗的说,我们创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收,这就是可能出现的内存泄露的情况。

  例如:缓存系统,我们加载了一个对象放在缓存中,然后一直不再使用他,这个对象一直被缓存引用,但却不在被使用。

      还有,大对象的频繁分配,会产生内存碎片,这也是内存泄露发生的情况。

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

常用的类:StreamReader,WebClient,Dictionary<K,V>,StringBuilder,SqlConnection,FileStream,File,ArrayList,Regex,List<T>;

常用的接口:IDisposable,IFormatter,IHttpHandler,IEnumerable,IDictionary,ICollection,IList;IComparable;

58.BS与CS的联系与区别。 

C/S 是Client/Server 的缩写。客户端需要安装专用的客户端软件。

B/S是Brower/Server 的缩写,客户机上只要安装一个浏览器。在这种结构下,用户界面完全通过WWW 浏览器实现,一部分事务逻辑在前端实现,但是主要逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

C/S 与B/S 区别:

1).硬件环境不同:

  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备.信息自己管理. 有比C/S 更强的适应范围, 一般只要有操作系统和浏览器就行。

2).对安全要求不同

  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S 发布部分可公开信息.  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

3).处理问题不同

  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统。C/S 的客户端由于是本地程序,因此和本地硬件、程序的交互性很强,比如可以控制本机的其他程序、可以读写本地磁盘文件、可以与硬件交互。B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S 无法作到的. 与操作系统平台关系最小,正应为如此B/S 很难和本地硬件、程序、文件进行交互,比如很难控制本机的其他程序、很难读写本地磁盘文件、很难与硬件交互,当然可以用ActiveX技术解决,比如网银等就是这么解决的,这样做的问题就是可能会被客户拒绝,而且只局限于Windows 操作系统。

  C/S 也分为两层架构和三层架构。两层架构:客户端程序程序直连数据库;三层架构:客户端访问服务端的服务,主要逻辑代码写在服务端的服务中,然后服务端服务再去访问数据库,Oracle 版分布式呼叫中心.

59.编写一个单例(Singleton)类。

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

public class FileManager

{
   private FileManager(){}

   public static FileManager instance=new FileManager();

}

60.什么是sql注入?如何避免sql注入?

用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL语句。使用参数化的SQL就可以避免SQL注入。(不直接构造SQL语句,可以避免;或者采用存储过程)

比如用户在输入密码时候输入: 1’ OR ‘1’ = ‘1。

61.数据库三范式是什么?

  • 第一范式:表数据的单一性(在关系模式中,每个属性都是不可分割的最小数据单位);
  • 第二范式:表必须要有主键(所有非主属性都完全依赖于任意一个候选关键字);
  • 第三范式:表引用其他表时候必须通过主外键引用(在关系模式中,所有的非主属性对任何候选关键字都不存在传递依赖);

注释:如果一个超关键字去掉其中任何一个字段后不再能唯一地确定记录,则称它为“候选关键字”(Candidate Key)。候选关键字既能唯一地确定记录,它包含的字段又是最精炼的。也就是说候选关键字是最简单的超关键字。

62.说出一些数据库优化方面的经验?

 索引内部原理:插入,删除,更新的速度变慢了,加上索引也多占用了空间,但是查询速度变快了。加上索引后速度提升非常明显。

  • 在经常检索的字段上使用索引提高查询速度;
  • select中只列出必要的字段,而不是*
  • 避免隐式类型转换造成的全表扫描,在索引上使用函数也会造成全表扫面;(因为索引只是为字段建立的,一旦使用表达式或者函数,那么索引就是失效了;当然也可以使用”函数索引“,”表达式索引“解决这个问题),使用索引不一定能提高查询速度;
  • 避免在索引列上使用计算(where Name +'A' = @myName, 这样会导致索引列失效);

Note:根据性能查看器的报表,对最耗时的SQL进行优化。

注释:

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为表设置索引要付出代价的:一是增加了数据库的存储空间二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)

 63.什么是数据库事务?

  数据库事务(Database Transaction),是作为单个逻辑单元执行的一系列操作,要么完整的执行,要么完全的不执行。

  一个逻辑工作单元要成为事务,必须满足ACID(原子性,一致性,隔离性,持久性)属性。

 原子性(atomic):事务内的所有操作,要么全部都行成功,要么全部执行失败。

          通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。

 一致性(Consistency):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。事务完成时和事务开始之前,数据库存储中的数据处于抑制状态。保证数据的无损。

 隔离性(Isolation):事务允许多个用户对同一数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

 持久性(Durability):数据结束后,事务处理的结果必须能够得到固话,他对系统的影响是永久性的。改修改即使出现致命的系统故障也将保持一致。

  事务的三个操作:Begin,Commit,RollBack。

在SQL语言中,定义事务的语句有三条

BEGIN Transaction

COMMIT

RollBack

有两种能够完成事务的操作,保持数据库的数据完整性

1.用sql存储过程;

2.在ADO.NET中一种简单的事务处理;

第一种例子

BEGIN TRANS

**************

**************

IF@@error <> 0

  ROLLBACK

ELSE

 COMMIT

protected void Button1_Click(object sender,EventArgs e)

    {

        SqlConnection con =newSqlConnection(@"DataSource=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); //连接字符串

        SqlCommand cmd = newSqlCommand("mon",con); //调用存储过程

        cmd.CommandType =CommandType.StoredProcedure;

        con.Open();

        SqlParameter prar = new SqlParameter();//传递参数

       cmd.Parameters.AddWithValue("@fromID", 1);

       cmd.Parameters.AddWithValue("@toID", 2);

       cmd.Parameters.AddWithValue("@momeys",Convert.ToInt32(TextBox1.Text) );

 

        cmd.Parameters.Add("@return","").Direction = ParameterDirection.ReturnValue;//获取存储过程的返回值

        cmd.ExecuteNonQuery();

        string value =cmd.Parameters["@return"].Value.ToString();//把返回值赋值给value

        if (value == "1")

        {

            Label1.Text = "添加成功";

        }

        else

        {

            Label1.Text = "添加失败";

       }

}

第二种例子

//再来看看不在数据库写sql存储过程,ADO.NET是如何处理事务的:

protected voidButton2_Click(object sender, EventArgs e)

    {

        SqlConnection con = newSqlConnection(@"DataSource=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");

        con.Open();

        SqlTransaction tran =con.BeginTransaction();//先实例SqlTransaction类,使用这个事务使用的是con 这个连接,使用BeginTransaction这个方法来开始执行这个事务

        SqlCommand cmd = new SqlCommand();

        cmd.Connection = con;

        cmd.Transaction = tran;

        try

        {

             //在try{} 块里执行sqlcommand命令,

            cmd.CommandText = "update bbset moneys=moneys-'" + Convert.ToInt32(TextBox1.Text) + "' whereID='1'";

            cmd.ExecuteNonQuery();

            cmd.CommandText = "update bbset moneys=moneys+' aa ' where ID='2'";

            cmd.ExecuteNonQuery();

            tran.Commit();//如果两个sql命令都执行成功,则执行commit这个方法,执行这些操作

 

            Label1.Text = "添加成功";

        }

        catch

        {

            Label1.Text = "添加失败";

            tran.Rollback();//如何执行不成功,发生异常,则执行rollback方法,回滚到事务操作开始之前;

        }

 

    }

  参考文档:http://blog.csdn.net/wang379275614/article/details/8740921

 64.谈谈你对设计模式的理解

 (工厂模式,单键模式)

大部分设计模式就是接口和抽象类的一个组合。(带扩展)

65.谈谈ViewState。谈谈对ASP.Net原理的理解。谈谈ASP.Net生命周期。

保存页面状态的一种机制。

例子:ListBox,单击按钮往listbox里增加item;当ListBox的EnableViewState被禁用掉后,点击按钮后只显示本次点击增加的item,前几次添加的item都没有保持住。

Http是无状态的,WebForm为了实现基于Http的”有状态“从而简化开发,ViewState用来在两次请求间保持状态。页面返回前将页面的状态序列化到ViewState中,这样就将状态保存在了浏览器中,下次页面提交的时候会顺便将ViewState提交到服务器,这样服务器就根据ViewState还原了状态,这样WebForm开发就像有状态一样了。

66.post、get的区别

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

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

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

67.Http默认端口?FTP?SQLServer?

Http默认端口为80,FTP默认端口为21,SQLServer默认端口为1433。

68.如果不用Visual Studio,用哪个命令行编译C#程序?

csc.exe。

69.UDDI是什么?

UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用描述、发现与集成服务”。

UDDI[1]是一种规范, 它主要提供基于Web服务的注册和发现机制,为Web服务提供三个重要的技术支持:①标准、透明、专门描述Web服务的机制;②调用Web服务的机制;③ 可以访问的Web服务注册中心。UDDI规范由OASIS(Organization for the Advancement of Structured Information Standards[1])标准化组织制定。[1]

Universal Description Discovery and Integration即统一描述发现和集成协议。

70.SOAP和HTTP的关系?

SOAP是基于HTTP协议的,和普通网页不同的是网页返回HTML,SOAP则是返回符合SOAP协议的XML数据。

71. .Net Framework中的类是专门供C#调用的是吗?

不是,VB.NET等语言都可以调用.Net Framework中的类。CTS,CLS。

72.开放性问题:说出尽可能多的基于.Net Framework 的语言。

C#,J#,VB.NET,F#,PowerShell,Ruby.Net,IronPython。

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

原文地址:https://www.cnblogs.com/zzunstu/p/3514201.html