C#面试题


问答题沿用

S1 C#:

Ch1:

1、= = 与Equals方法的区别?

对于值类型:由于值类型是存储在栈中,两者都是比较的是两个变量的在栈中的值是否相等。

对于引用类型:引用类型是在堆一个存储引用,指向堆中的某个具体值。= =判断引用地址,equals判断值

       2、Java中的switch于C#中的switch的区别

       Java中的switch:只能判断int, short及比int所占字节还少的类型

         C#中的switch:可以判断string及比string所占字节少的类型

Ch2:

1、  冒泡排序(c#)口诀

           int[] numbers ={ 49, 12, 65, 45, 88, 54 };

            //排序前

            Console.WriteLine("排序前:");

            foreach (int i in numbers)

            {

                Console.Write(i + "  ");

            }

            //冒泡排序

            for (int i = 0; i < numbers.Length; i++ )

            {

                for (int j = 0; j < numbers.Length - 1 - i; j++ )

                {//将最大数交换到最后

                    if(numbers[j] > numbers[j+1])

                    {

                        int temp = numbers[j];

                        numbers[j] = numbers[j + 1];

                        numbers[j + 1] = temp;

                    }

                }

            }

            //排序后

            Console.WriteLine("/n排序后:");

            foreach (int i in numbers)

            {

                Console.Write(i + "  ");

            }

2、  分别写出四种循环语法

for(int i=0;i<length;i++){}     while(true){}  foreach(int i in numbers){}   do{}while(true);

3、  编程求数组中的最大数,打印所有的水仙花数,打印九九乘法表

求最大数:int[] numbers ={ 49, 12, 65, 45, 88, 54 };

            int max = 0;

            for (int i = 0; i < numbers.Length-1; i++ )

            {

                if(numbers[i] > numbers[i+1])

                {

                    max = numbers[i];

                }

            }

            Console.WriteLine("最大数为:"+max);

                  水仙花数:for (int i = 100; i < 1000; i++ )

            {

                int a = i % 10;        //个位数

                int b = i % 100;    //十位数

                b = b / 10;

                int c = i / 100; //百位数

                int number = (int)Math.Pow(a, 3) + (int)Math.Pow(b, 3) + (int)Math.Pow(c, 3);

                if(number == i)

                {

                    Console.Write(i + "   ");

                }

            }

                  打印九九乘法表:for (int i = 1; i <= 9; i++ )

            {

                for (int j= 1; j <= i; j++)

                {

                    Console.Write("{0}×{1}={2}/t", j, i, i * j);

                }

                Console.WriteLine();

            }

Ch3:

1、  命名空间的含义:包,便于管理

2、  引用传递和值传递的区别:主要是相对于值类型,用引用传递加ref,就可实现其值真正的改变。值传递,当调用方法结束后,则不会改变值。

3、  请写出String的常用方法(10个),并描述功能

Equals():判断值相等          Split():以…分割每个字符为string[]数组             IndexOf():返回指定字符的索引

Concat():连接,相当于’+’号       Trim():忽略前后空格        ToUpper():转换为大写      ToLower():转换为小写

StartsWith():开头字符是否匹配  SubString():截取字符串    ToCharArray():转换为char[]数组

4、  分别写出数据类型转换(至少四种)的方法,代码举例

显示转换:int i=(int)12.9;

隐式转换:double d=12;

int/double/float.parse ()转换:string s=”13”;              int i=int.parse(s);

convert:int x = 13;       double d = Convert.ToDouble(x);

Ch4:

1、  Partial关键字的含义

Partial局部类型允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。

适用于以下情况:(1) 类型特别大,不宜放在一个文件中实现。(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。(3) 需要多人合作编写一个类

http://blog.csdn.net/dotnet90/archive/2006/12/23/1455796.aspx

2、  Windows窗体的生命周期常用事件有哪些?

Initialize, Load, Activated(窗体被激活时), Deactivate(窗体被停用时), FormClosed, FormClosing

3、  写出常用的控件键盘事件和鼠标事件

键盘事件:KeyDown, KeyUp, KeyPress

鼠标事件:Click,DoubleClick,MouseClick,MouseDown,MouseEnter,MouseHover,MouseLeave,MouseMove,MouseUp

4、  请写出MessageBox常用的四种类型,以及返回值类型

MessageBox.Show(“消息内容”);   返回类型:DialogResult

MessageBox.Show(“消息内容”,”标题”);    返回类型:DialogResult

MessageBox.Show(“消息内容”,”标题”);    返回类型:DialogResult

MessageBox.Show(“消息内容”,”标题”, MessageBoxButtons按钮类型);    返回类型:DialogResult

MessageBox.Show(“消息内容”,”标题”, MessageBoxButtons按钮类型, MessageBoxIcon图标类型

);   返回类型:DialogResult

Ch5:

1、  anchor和dock的区别

anchor(锚定):距离容器边缘的距离,当控件锚定到某个边缘时,与指定边缘最接近的控件边缘与指定边缘之间的距离将保持不变。

dock(停靠):将控件停靠在窗体或容器的边缘,距离为0px

2、  如何创建一个MDI窗体(步骤),即多文档窗体

1)设置子窗体:子窗体名称 form = new  Form(); form.MdiParent=this(父窗体); form.show();

2)设置父窗体属性:isMdiContainer=true;

3、  模式窗体和非模式窗体的区别

模式窗体:form.ShowDialog();有返回值:DialogResult;程序会中断,主窗体不能激活,必须关闭模式窗体才能激活主窗体, 只能show出一个

非模式窗体:form.Show (); 无返回值,程序不会中断;可以show出多个

4、  使用第三方类传递窗体间的数据(代码演示)

public class UserHelpper

        {

        public static string loginId = "";     //用户名

         public static string loginType = "";   //登录类型

}

Ch6:

1、  ADO.Net重要组件(那幅图6.2)

.NetFramework和DateSet

2、  数据提供者程序有哪些

3、  连接字符串的写法(两种)

"Data Source=./SQLEXPRESS;Initial Catalog=数据库名;Integrated security=true;"

"server=./sqlexpress; database=数据库名; uid=用户名; password=密码"

4、  Connection对象的属性和方法:数据库连接对象

属性:state 连接状态, DataBase 获取连接对象的数据库名称, DataSource连接对象的实例名

方法:Open()/Close() 打开/关闭数据库, Dispose() 释放连接资源, ChangeDatabase() 为打开的当前连接对象更改数据库名。

5、  异常处理各关键字的作用

try:可能发生异常的代码块

catch:捕获到何种异常,如何去处理, 可以跟多个catch块,但子类异常必须写在父类异常的前面

finally:不管有没有异常都将执行的代码块

6、  Command对象的属性和方法:SQL语句执行命令

属性:CommandText获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程。 Connection获取或设置 SqlCommand 的此实例使用的 SqlConnection

方法:ExecuteNonQuery() 执行增,删,改语句,并返回受影响行数; ExecuteScalar() 执行查询,返回结果的第一行第一列,忽略其他列或行; ExecuteReader() 执行查询,返回DataReader对象

Ch7:

1、  DataReader对象的主要属性和方法

属性:HasRows 有没有读取到DataReader中的数据;IsClosed 是否已关闭DataReader对象

方法:Read() 读取一行数据;GetString()/GetDouble()… 获取何种类型的数据值; Close() 关闭DataReader对象; IsDBNull() 获取一个值,用于指示列中是否包含不存在的或缺少的值

2、  请写出获取并使用DataReader对象的步骤

1)建立数据库连接conn=new …Connection(…);          2)创建Command对象cmd= new …Command(sql, conn);        3)执行SQL查询命令sdr=cmd. ExecuteReader();      4)处理数据 while(sdr.Read()){int i=sdr.getInt(0);}

Ch8:

1、  请写出DataSet(临时数据库)的内部结构(图8.2)

2、  写出填充一个DataSet的步骤

3、  数据集的工作原理(图8.3)

4、  如何将数据集中的数据保存到数据库,请写出步骤

 

 

 

 

S2 深入.NET

       Ch1:

1、  画出.NET框架的结构(图1.7)

.net Framework类库:ASP.Net(Web和Web Service)、WinForms、ADO.Net和XML类、基本框架类。

CLR:CLS和CTS。

2、  解释CTS(Common Type System通用类型系统)和CLS(Common Language Specification公共语言规范)的含义

CTS:解决不同语言的数据类型不同的问题。

CLS:实现多种语言之间的互操作性。

3、  C#编译器
 
画出.NET编译过程(图1.8)

C#代码
 
Microsoft中间语言

(MSIL)
 
平台专用代码
 
VB.Net代码
 
VB.net编译器
 
CLR
 
JIT编译器
 
 

 

 

 


4、  解释.NET解决了DLL灾难

 

5、  解释垃圾回收机制工作原理(回去查资料)

垃圾回收器是用来管理应用程序的内存分配和释放的。当一个应用程序在运行的时候,垃圾回收器设置了一个托管堆。每次当开发人员使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。新创建的对象被放在上次创建的对象之后。垃圾回收器保存了一个指针,该指针总是指向托管堆中最后一个对象之后的内存空间。当新的对象被产生时,运行库就知道应该将新的对象放在内存的什么地方。当垃圾回收器的指针指向托管堆以外的内存空间时,就需要回收内存中的垃圾了。在这个过程中,垃圾回收器首先假设在托管堆中所有的对象都需要被回收。然后它在托管堆中寻找被根对象引用的对象(根对象就是全局,静态或处于活动中的局部变量以及寄存器指向的对象),找到后将它们加入一个有效对象的列表中,并在已经搜索过的对象中寻找是否有对象被新加入的有效对象引用。直到垃圾回收器检查完所有的对象后,就有一份根对象和根对象直接或间接引用了的对象的列表,而其它没有在表中的对象就被从内存中回收

6、  CLR主要用途(Common Language Runtime公共语言运行时)

是所有.Net应用程序运行时的环境,所有应用程序都要使用的编程基础,它如同一个支持.Net应用程序运行和开发的虚拟机。

Ch2:

1、  什么是类和对象

类:具有相同特征工共同行为的一级对象的集合。是一个模子。

对象:是真实的实体。

它们的关系:由对象归纳为类,是归纳对象共性的过程;在类的基础上,将状态和行为实体化为对象的过程称为实例化。

2、  什么是封装

封装是面向对象的三大特性之一,用于隐藏内部实现,对外只暴露对类的基本操作,而不会让其他对象影响类的实现。

3、  什么是函数重载

一个类中两个以上的方法,名字相同使用的参数类型或参数个数不同,称为重载。

其方式包括两种:参数不同类型的重载和参数个数不同的重载。

4、  解释静态方法和实例方法的差别(表2-2)

实例方法:需要使用类的实例对象来调用的方法
 静态方法:通过“类名.方法名”来调用的方法
 
不需要static关键字
 Static关键字修饰
 
实例对象调用
 类名调用,不需要new出来
 
可以直接访问静态成员
 可以访问静态成员
 
可以直接访问实例成员
 不可以直接访问实例成员
 
可以直接调用实例方法和静态方法
 不能直接调用实例方法
 
实例化对象时初始化
 调用前初始化
 


 

5、  写出Pascal和Camel命名法的意义

Pascal命名法:类、属性、方法(公有成员)的命名,单词的第一个字母要大写。

Camel命名法:变量(私有成员)的命名,首字母小写,后面的单词首字母大写。

只通过名称就能猜出此变量的含义,采取有意义的单词。

6、  写出out与ref的区别:都可以将参数值的更改保留

out传递参数:侧重于输出,必须对out参数先进行赋值。

ref传递参数: 侧重于修改,可以不先赋值。

Ch3:

1、  说明枚举的作用

枚举可以避免不合理的赋值,它表示一组有限的值,对可能的值进行约束;更易于输入,使代码更清晰,允许描述性的名称表示数据,使用时直观方便。

2、  写出如何用枚举来进行复合状态判断(上课扩展):http://aierong.javaeye.com/blog/282925

定义性别枚举:public enum Gender

              {

                  male=0, female=1

 }

//将字符串”male”转换为枚举:Gender 性别 = (Gender)Enum.Parse(typeof(Gender), "male");

//将数字0转换为枚举:Gender 性别男 = (Gender)Enum.Parse(typeof(Gender), "0");

//将枚举转换为数字:int i = Convert.ToInt32(Gender.male);

或:int j = ((IConvertible)((System.Enum) Gender.male)).ToInt32(null);

 


 

3、  结构和类的差别(表3-1)

结构struct
 类class
 
值类型
 引用类型
 
不能被继承
 可以被继承
 
可以有默认构造函数
 可以有默认构造函数
 
添加的构造函数必须带参数
 可以添加无参的构造函数
 
创建对象可以不用new
 创建对象必须使用new
 
在结构中给字段赋值是错误的
 类中可以给字段赋值,不能写属性
 
都可以包含字段、方法,也都可以实现接口
 


 

4、  什么是值类型,什么是引用类型

值类型:每个值类型的对象都有一个独立的内存区域保存自己的值,源自System.ValueType,主要包括基本数据类型、结构、枚举

引用类型:存储的是对象的引用,源自System.Object,主要包括类类型、接口类型、数组等

5、  int i=0; object o=new object();运行前两句的内存图

栈区:

int i
 0
 
100H
 new Object()
 

 
 
堆区:

Object o=100H
 
 
 

 
 
 

 

 

 

 


6、  什么是装箱拆箱并举例说明

装箱:把值类型转换成引用类型的过程 int i=10; object obj=i;

拆箱:由引用类型转换为值类型的过程 int j=(int)obj;

7、  请创建一个学生类的类关系图


Ch4:

1、  arrayList和hashtable的区别点,写出两种集合的常用方法

ArrayList:实现IList接口,IList继承自ICollection
 HashTable:键-值 key-value
 
使用大小可按需动态增加的数组实现
 表示键/值对的集合,这些键/值对根据键的哈希代码进行组织
 
只能通过数字索引访问元素
 可以通过数字索引和key访问元素
 
常用方法:Add()、Contains()、Remove()、RemoveAt()、ToArray()、Clear();

属性:Count、Item
 Add()、ContainsKey()、ContainsValue()、Remove()、Clear();

属性:Keys、Values、Count、Item
 


2、  什么是泛型,解释泛型的含义及优点

泛型:将类型参数化,通过泛型可以定义类型安全的数据类型,保证了类型的安全性,其性能更高。

如:List<int> list=new List<int>; 访问时不用再进行类型转换,添加元素时也只能添加int类型的数据。

Ch5:

1、  文件读写流程

1)创建文件流:FileStream fs = new FileStream(@"C:/test.txt", FileMode.Create);

            2)创建写入器:StreamWriter sw = new StreamWriter(fs); /读取器:StreamReader sr

            3)写入内容:sw.Write("aaaaaa"); /string content=fs.ReadToEnd();

            4)关闭写入器:sw.Close(); /sr.Close();

5)关闭文件流:fs.Close();

2、  静态类和非静态类的区别

静态类
 非静态类
 
用static修饰
 不用static修饰
 
只包含静态成员
 可以包含静态成员,也可以包含非静态成员
 
不可以包含实例成员
 可以包含实例成员
 
使用类名调用静态成员:类名.方法名()
 使用实例对象调用非静态成员
 
不能被实例化
 可以被实例化
 
不能包含实例构造函数
 可以包含实例构造函数
 


3、  什么是XML:eXtensible Markup Language 可扩展标记性语言

XML用于描述数据,每对标记称为节点,是成对出现的,其各个节点可以自由地扩展,节点区分大小写

4、  写出xmlDocument、xmlNode的常用属性和方法

xmlDocument对象可表示整个XML文档:Load() 读取整个XML结构、ChildNodes 获取所有子节点、DocumentElement获取根节点。

xmlNode表示XML中的节点:InnerText 当前节点的内容、Name当前节点的名字、ChildNodes当前节点的所有子节点。

Ch6:

1、  什么是继承

一个类可以继承自另一个类,比如学生类Student和老师类Teacher继承自Person类,被继承的类称为父类或基类,继承自其他类的类称为子类或派生类。

继承关系在类图中用箭头表示,箭头指向父类。它们符合is-a的关系,即子类is a父类。

继承中的方法重写,虚方法等。用base关键字可以从子类访问父类的属性与方法。

2、  请写出public、private、protected的区别(表6-1)

修饰符
 类内部
 子类
 其他类
 
public
 可以
 可以
 可以
 
private
 可以
 不可以
 不可以
 
protected
 可以
 可以
 不可以
 


Ch7:

1、  什么是抽象类,什么是抽象方法

抽象方法是一个没有实现的方法,在定义方法时增加关键字abstract声明,它没有包括方法执行逻辑的方法体。如:public abstract void SayHi();  含有抽象方法的类称为抽象类。但抽象类的方法并不一定全是抽象方法,也可以包括具体方法。抽象类不能被实例化,也不能是密封或静态的。

2、  Override和new的区别

override:在子类或实现类中用来重写抽象方法或虚方法。将覆盖父类的方法。

new:在子类的用new关键字修饰的方法,将会是一个新的方法,它不会覆盖父类的方法。

3、  解释什么是里氏替换原则(左父右子)

一般发生在多态的情况下。如:父类类型 对象 = new 子类类型();

4、  is和as的区别

is:用于判断类型时,返回true/false。

as:用于两个对象之间的类型转换,当转换失败时,返回null,不会引发异常。

5、  解释关键字virtual的含义

Virtual用来修饰虚方法,虚方法可以有具体的实现,也可以被子类重写。

6、  请画图说明简单工厂设计模式

父类产品
 
子类产品A
 
子类产品B
 
子类产品C
 
工厂
 
客户
 
 

 

 

 

 

 

 

 


7、  虚方法和抽象方法的区别

虚方法
 抽象方法
 
用virtual修饰
 用abstract修饰
 
要有方法体,哪怕只有一个分号
 不能有方法体
 
可以被子类override
 必须被子类override
 
除了密封类外都可以写
 只能在抽象类中
 


 

8、  面向对象的三大特性是什么? 并简述每个原则的基本功能

三在特征:封装、继承、多态。

Ch8:

1、  请解释接口和抽象类的异同点(表8-1)

接口
 抽象类
 
用interface修饰
 用abstract修饰
 
实现类可以实现多个接口
 只能继承一个类
 
实现接口的类必须实现所有接口中的成员
 非抽象派生类必须实现抽象方法
 
直接实现
 需要override实现抽象方法
 
都不能实例化,且均包含未实现的方法,其派生类必须实现未实现的方法。
 


 

2、  接口作为参数的意义和接口作为返回值的意义

接口作为参数时,我们只需要传递一个实现了接口的对象,只要此对象实现了该接口都可作为参数传递进去。

接口作为返回值时,实际上要返回的也是实现了接口的对象。

3、  隐式实现接口和显示实现的操作(代码)

定义接口:public interface IPerson

              {

                  void SayHi();

}

隐式实现:public void SayHi()

             {

                   throw new Exception("The method or operation is not implemented.");

}

显示实现: 避免了接口成员之间因为同名而发生混淆。不能通过类的实例进行访问,强制转换为接口调用。

void IPerson.SayHi()

             {

                   throw new Exception("The method or operation is not implemented.");

}

http://cometlj.javaeye.com/blog/377912

Ch9:

1、  什么是特性

特性:即为目标元素(可以是数据集、模块、类、属性、方法、甚至函数参数等)加入附加信息,类似于注释。其本质上也是一个类。一般来说,特性命名都以Attribute结尾,使用时可以省略。

2、  什么是序列化,写出序列化的基本过程(图9-3)

格式化程序

 
 
序列化:将对象的状态存储到特定存储介质中的过程,也可以说是将对象状态转换为可保持或传输的格式的过程。在序列化过程中,会将对象的公有成员,私有成员包括类名,都转换成数据流的形式,存储到存储介质中,即通常所说的文件。

 

对象是否可序列化
 
对象的成员是否

可序列化
 
格式化器将对象格式化为特定格式数据流
 
写入文件
 
结束

 
 
异常处理退出
 
Yes
 
No
 
No
 
Yes
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


3、  序列化和反序列化的用途

当我们需要将对象的字段值保存在磁盘中时,不需要再去编写大量对象去写入,只需要将每个对象加一个可序列化标记[Serializable],就可实现。在远程通信中应用非常广泛。

4、  程序集和命名空间的区别

程序集就是一个编译好的.exe文件,是.net框架应用程序的生成块,它包含编译好的代码逻辑单元。.dll也是一个程序集。

而命名空间namespace是相当于一个包,使用管理我们的代码。

5、  程序集的结构

程序集由描述它的程序集清单(包含指定该程序集的版本要求和安全标识所需的所有元数据)、类型元数据、MSIL代码(实现类型元数据的中间代码)和资源组成。

6、  Sealed修饰属性、方法、类的含义

Sealed修饰类时,表示该类不能再被继承,不能和 abstract 同时使用,因为它们在含义上互相排斥。

用于方法和属性时,表示该方法或属性不能再被重写,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员。

通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱

7、  什么是反射,及功能

反射就是可以用ILDasm反编译工具浏览一个dll和exe的构成。反射可以获取已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。也可以利用反射在运行时创建类型实例以及调用和访问这些实例。还可以查找程序集的信息。

8、  使用反射实现加载程序集,并实例化该程序集中某一类型,并调用该类型中的某一方法(代码实现)

如:string version=Assembly.LoadFile(@“D:/test.ext”).GetName().Version.ToString();

S2 在.NET框架下开发三层结构

       Ch1:

1、  什么是三层结构,并解释各层次的主要功能(图1-7)

三层:表示层、业务逻辑层(BLL)、数据访问层(DAL)。

表示层
 
业务逻辑层
 
数据访问层
 
为用户提供交互操作界面
 
负责关键业务的处理和数据传递
 
实现数据库访问
 
 

 

 

 

 

 

 


2、  请写出三层数据传递方向(图1-12)

表示层
 
业务逻辑层
 
数据访问层
 
客户请求
 
客户请求
 
响应数据
 
响应数据
 
 

 

 

 

 

 

 

 

 

 


3、  三层开发的优势

便于维护与后期开发,分工明确。

Ch2:

1、  什么是DataView

就是DataTable的动态视图,并可以对动态生成的视图中的数据进行排序、筛选等操作。

2、  使用三层开发用户登陆(画类图)

 

3、  使用代码实现DataSet结构(32页)

两种方式:1)通过指定DataSet中具体的DataTable的某行某列来获取数据:通过表名(从DataSet中获取指定的DataTable)、通过索引(从DataTable中获取指定的DataRow)、通过列名(从DataRow中获取指定列的数据)。2)将DataSet中的数据直接绑定到数据展示控件上

Ch3:

1、  实体类在三层结构中的应用(图3.1)

三层结构之间数据传递的载体,可以消除关系数据与类之间的差别,以便更好地使用面向对象思想来实现系统。

2、  Using关键字在c#中的用法

有两种用法:1)作为指令,引入命名空间;2)作为语句,允许用户定义一个范围,并在此范围末尾自动释放对象。

Ch4:

1、  为什么需要异常处理

处理程序运行时发生的错误。

当异常发生时,系统要能够自动处理,避免系统终止运行,防止出现故障而导致的系统崩溃。

2、  如何进行异常处理

Try…catch…finally

注意:不要用太多的异常处理,同时要尽量避免使用嵌套异常处理,因为异常处理使用不合理会使系统的性能下降。

3、  什么是单元测试

软件开发中的单元测试是对整个项目中的某一个模块及模块中的某一个类、或某类中的某一个方法的测试。

4、  为什么需要单元测试

单元测试要确保编写的代码语法和语义都正确,确保软件质量的具体操作方法。

5、  如何使用VSTS写单元测试(步骤)

创建测试、编写测试、运行测试。

6、  Exception类的常用属性(MESSAGE,SOURCE)的含义

Message:提供引用异常的详细信息

Source:导致异常发生的应用程序或对象的名称。

7、  简述throw关键字在异常处理中的使用过程

throw表示手动抛出一个异常。

如:throw new Exception(“我抛出的异常!”);

Ch5:

1、  什么是设计模式

设计模式描述了软件开发过程中某一类常见问题的一般性解决方案。

而面向对象设计模式是对在特定场景下,解决一般设计问题中类与相互通信工程对象的描述。

2、  客户
 
抽象工厂设计模式结构图(图5-4/图5-5)

抽象工厂(基类)
 
实体工厂1
 
实体工厂2
 
抽象产品A
 
实体产品A2
 
实体产品A1
 
抽象产品B
 
实体产品B2
 
实体产品B1
 
 

 

 

 

 

 

 

 

 

 

 


3、  简述使用接口、抽象类、抽象方法实现抽象工程设计模式的过程

 


 

Y2 ASP.NET

       Ch1:

1、    ASP.NET的特色与优势(第7页)

优点:1)与浏览器无关;2)方便设置断点、易于调试;3)编译后执行,运行效果提高;

4)丰富的控件库;5)代码后置;

Ch2:

1、  简述ASP.NET的请求流程,说明第一次请求和第二次请求

.aspx文件
 
Asp.net

引擎
 
后置代码
 
生成的页面类
 
页面类
 
第一次请求
 
解析
 
生成
 
编译
 
响应
 
第二次请求
 
第二个请求

实例化
 
 

 

 

 

 

 

 

 

 

 

 


2、  说明Page的Language、AutoEventWireup、CodeFile、Inherits的含义

Language:指定页面代码和后置代码使用的语言;

AutoEventWireup:设置页面是否自动调用网页事件,默认为true;

CodeFile:指定代码后置的文件名

Inherits:页面类

3、  Request对象的QueryString、Form、ServerVariable、params的含义

QueryString:收集以Get方式请求而发送的数据;

Form:收集以Post方式请求而发送的数据;

ServerVariable(环境变量):包含服务器和客户端的系统信息;

Params:以上三种方式的集合,不区分是由哪种方式传递的参数。

4、  COOKIE、SESSION、APPLICATION的区别(表42页)

Cookie:保存少量的、简单的数据,一般不允许超过4KB(与浏览器有关)使用期限可以灵活设定,面向单个用户,保存在客户端。

Session:也只能保存少量的、简单的数据,面向单个用户,单个连接的信息,保存在服务器端。当Session超时或被关闭时,将清空保存的数据(20分钟)。一般用来保存单个用户的登录信息。

Application:能够保存任意大小的信息,在整个应用程序周期中有效,是面对所有应用程序用户的,保存在服务器端。一般保存一些用户共享的的信息。

5、  简述一个session的生命周期(创建->销毁的过程)

一般来说,一个IE启动后,开始请求服务器端的数据开始,Session就创建,当用户停止使用应用程序后(会话结束时),SessionSession一般还要保存20分钟才真正销毁。

6、  说明Server对象的常用方法(第43页表2)

HtmlEncode:可将其html标签,在浏览器中显示成字母,而不转换成标签。

HtmlDecode:与HtmlEncode相反,对已编码的内容进行解码。

MapPath:返回指定路径在磁盘中的绝对路径。

UrlEncode:对URL进行编码,如’#’,’&’等。

UrlDecode:与UrlEncode相反,对URL地址进行解码。

Execute:可将两个页面合并成一个页面显示。

Transfer:服务器端转向,使地址栏不发生变化。

7、  进程COOKIE和永久化COOKIE的区别

进程COOKIE:内存cookie,服务器停止就消失,在服务器运行

永久化COOKIE:

8、  代码演示从客户端取COOKIE,并回写到客户端

 

9、  用session和Cookie保存购物车的流程

 Ch3:

1、  html服务器控件和web服务器控件的区别

html服务器控件;直接产生html标签,响应较快,但功能弱。继承自:System.Web.UI.HtmlControls类。

web服务器控件:转换以后产生html标签,功能强,响应慢,可以执行复杂的页面请求。继承自:System.Web.UI.Control类。以asp:为前缀。

2、  母版页的特点

母版页是以“.master”为后缀的文件,它可以将页面上的公用元素整合到一起,对应内容页。

有4个特点:1)有利于站点修改和维护,降低开发人员的工作强度。2)提供高效的内容整合能力。3)有利于实现页面布局。4)提供一种便于利用的对象模型。

3、  母版页和普通页的区别

区别:1)声明:母版页对应Master,普通页对应Page。2)扩展名:母版页对应.master,普通页对应.aspx。3)ContentPlaceHolder控件:母版页可以使用ContentPlaceHolder控件,而普通页不可以使用该控件,普通页应用母版页时多产生标签asp:content。

Ch5:

1、  Control类
 
数据源控件的说明(表5-1)

 

普通数据源控件
 
层次化数据源控件
 
ObjectDataSource
 
SqlDataSource
 
XMLDataSource
 
SiteMapDataSource
 
AccessDataSource
 
 

 

 

 

 

 

 


2、  Eval和Bind的区别

Eval:只读(单向数据绑定),所绑定的内容不会提交回服务器,有一个重载的方法,以实现格式化

Bind:支持读/写(双向),可以更新数据,常常为TextBox控件绑定数据,以提交给服务器

Ch6:

1、  验证控件的工作原理

2、  写出5大验证控件,并分别写出常用属性

验证控件都有一个共同的属性:ControlToValidate 要验证的控件ID

1) RequiredFieldValidator非空验证: Text, ErrorMessage

2) CompareValidator 验证用户输入的内容是否符合要求。

3) RangeValidator 检查范围: MaximumValue, MinimumValue, Type

4) RegularExpressionValidator 正则表达式:

5) CustomValidator 用户自定义验证: ClientValidationFunction, OnServerValidate;

Ch7:

1、自定义分页的SQL语句

       Select Top PageSize * from tablename where 条件 and id not in(select Top PageSize * (pageIndex-1)*PageSize order by 排序条件) order by 排序

2、使用自定义分页的步骤用名字描述

3、  GridView、DataList、repeater三大控件的特点

dataList, repeater两控件的用户类似: repeater不会产生多余的html标签

gridView:比较古板的多行显示。

Ch9:

1、  什么是用户控件: User Control

一种自定义的组合控件,通常由系统提供的可视化控件组合而成。它不仅可以定义显示界面,还可以编写事件处理代码。

2、  用户控件和普通页面的区别(表9-1)

 
 用户控件
 普通页面
 
后缀名
 .ascx
 .aspx
 
指令
 @Control
 @Page
 
继承
 System.Web.UI.UserControl
 System.Web.UI.Page
 
包含
 可以包含控件和其他用户控件,也可以被其他用户控件和页面包含
 可以包含控件和所有用户控件,但是不可以被其他页面所包含
 
直接访问
 不可以,必须包含在页面中才能发挥作用
 可以
 
标签
 不能包含<Html>、<body>等html标签
 可以包含所有的html标签
 
编译和运行
 可以独立编译,但不能单独运行。不可以直接访问。
 可直接访问
 


 

3、  写出用代码加载用户控件的步骤

4、  写出ASP.NET http请求内部过程(图9-12)并解释HTTPMODEL和HTTPHandler

5、  使用HTTPhandler实现水印的步骤

 

Ch10:

1、  web.config和machine.config的层次结构(图10.1)

2、  配置节点和读取该节点的代码

3、  解释身份验证类型(表10-1)

4、  Form常用属性(表10-2)

5、  如何配置自定义错误(P257)

 

 

Y2 使用AJAX和WEB Service重构网上书店

       Ch1:

1、  web service的优点

1)  是可互操作的分布式应用程序 2)具有普通性,它使用HTTP和XML进行通信

3)可以穿越防火墙,真正实现自由通信 4)通过SOAP实现异地调用

2、  解释SOAP协议

SOAP是Web Service的基本通信协议。它是在分散或分布式的环境中交换信息的,是基于XML的协议。通过它我们可以实现不同项目、不同站点,甚至异地调用。

3、  说明WSDL的作用,描述XML配置节的含义

Ch2:

1、  ajax的组成原理,并用代码实现

XmlHttpRequest从服务器(数据服务器或WEB服务器)获取数据到客户端的内存中,然后javascript根据实际需要对这些资源进行处理,并通过CSS和DOM实现界面布局呈现给浏览器。

2、  ASP.NET AJAX框架组成

主要包括:核心组件、工具包、增值组件、示例代码、框架类库5个部分

Ch4:

1、  为什么需要使用缓存,缓存的优势

因为:Web应用程序通常是需要不断的和数据库交互,如果在数据量非常大的情况下,将会严重降低应用程序的性能,甚至还会造成Web应用程序崩溃。

使用缓存是把访问频繁的数据以及需要大量处理时间来创建的数据存储在服务器内存中,当用户请求这些数据时,系统直接将内存中的数据返回给用户,从而大大提高应用程序的性能。

2、  整页缓存的主要属性P85

Duration:必需属性,表示缓存时间

VaryByParam:参数传递的缓存

VaryByControl:用户控件的缓存

Location:指定输出缓存项的位置,默认为Any

VaryBycustom:自定义输出缓存

3、  缓存的依赖性有哪些(数据缓存)

 

4、  如何实现部分页面缓存

最常用的方法是缓存后替换:

通过使用控件substitution实现,此控件可以用来替换缓存页面需要更新的部分。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiangchengboy/archive/2009/11/05/4770320.aspx

原文地址:https://www.cnblogs.com/Fandyx/p/2761456.html