面试加笔试大全

.Net工程师宝典


 

技术类面试、笔试题汇总

注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系。

 

下面的参考解答只是帮助大家理解,不用背,面试题、笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能“以不变应万变”。回答问题的时候能联系做过项目的例子是最好的,有的问题后面我已经补充联系到项目中的对应的案例了。

 

 

1、简述 private、 protected、 public、 internal 修饰符的访问权限。

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

protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。

internal: 当前程序集内可以访问。             

 

2、ADO.NET中的五个主要对象

Connection:主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,是无法从数据库中取得数据的。Close和Dispose的区别,Close以后还可以Open,Dispose以后则不能再用。

Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连接到数据源。

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。

DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。

DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。

ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。

 

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

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

2.使用Session变量

3.使用Server.Transfer

4.Cookie传值

 

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

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

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

3委托和事件没有可比性,因为委托是类型,事件是对象,

  4事件的内部是用委托实现的。

 

1. 事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托.
2. 通俗的讲,委托你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发
3. 也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它,而事件不能直接调用,只能通过某些操作触发
4. 你可以理解事件就是一个或多个委托,此话应该有误的吧,事件可以有多个事件处理函数,委托同样也可以是个多播委托

 

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

 

 

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

 

这个是n多面试笔试里面爱出的一道题,老生常谈。。。
我讨厌复制粘贴,直接告诉你我的理解,希望对你有帮助---
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。
给你举个例子:
//声明一个委托,这里的NewDelegate()可以理解为是之后用来取方法的一个类型。
delegate void  NewDelegate();
//下面定义的a,b两种方法,你可以理解为NewDelegate这个类型的两个实例。
public void a(){};
public void b(){};
public void main()
{
       NewDelegate dgt1=new NewDelegate(a);
       NewDelegate dgt2=new NewDelegate(b);
  //dgt1指向方法a,dgt2指向方法b。也就是说一个方法的返回值和参数类型数量与声明的委托
 //相符时,就可以用一个委托来调用这个方法。而这个方法的名称作为参数传递给实例化的那个委托
}

事件是一种特殊的委托,为什么这么说呢?
用反编译工具反编译.net framework即可发现,事件的定义(这里只是举其中一种事件的定义,事件的参数在类库中定义有区别),如下:
public delegate void EventHandler(object sender, EventArgs e);
而常见的各种控件的Click事件是如何定义的呢?
public event EventHandler Click;
说明 Click事件是一个委托
而我们常见的一个Button控件添加一个事件是怎么做的呢?
PageLoad里:Button1.Click+=new EventHandler(Button1_Click);
定义Button1的事件 protected Button1_Click(object sender,EventArgs e){}
如你所见,这是一个很典型的委托调用。

 

 

C# 中如何利用lambda实现委托事件的挂接

在写一个小程序的时候,碰到了这样的问题,需要用委托来挂接事件,但是又想在这事件中使用局部的变量,而委托一旦定义好后,挂接方就没有办法再添加额外的形参了。那有没有什么办法,可以实现呢  

  委托定义如下:

代码如下: 
public class SocketSp
{
 public delegate void ReceiveCompleted(byte[] receiveBuffer, int receiveTotalLen,Exception ex);
 public ReceiveCompleted receiveCompleted;
}
挂接方定义如下

 代码如下: 
public class LinkOuter
{
 SocketSp linkOuterSocket = new SocketSp();
       private void test(Socket requestHandleSocket)
      {
           //此处要挂接  linkOuterSocket.receiveCompleted 事件,同时想将参数requestHandleSocket传入,以便后续处理。
      }
}

  
第一个想法是利用delegate,但是失败了。因为虽然挂接上去了,委托传进的参数丢了,无法进行后续操作。

代码如下: 
private void test(Socket requestHandleSocket)

linkOuterSocket.receiveCompleted += delegate {
//To do
};
}


第二个想法是利用Action,结果也失败了。IDE提示委托Action未采用3个参数。

代码如下: 
private void test(Socket requestHandleSocket)
{
linkOuterSocket.receiveCompleted += (Action)((outerReceiveBuffer, totalLen, ex) => { 
//To do
});
}
第三个想法是利用lambda表达式,先与委托挂接,同时利用局部变量的调用,来实现参数传递到sendResponse函数中,以便后续操作。

代码如下: 
private void test(Socket requestHandleSocket)
{
linkOuterSocket.receiveCompleted += new SocketSp.ReceiveCompleted((outerReceiveBuffer,totalLen,ex) =>

byte[] realOuterReceiveBuffer = new byte[totalLen]; 
Array.Copy(outerReceiveBuffer, 0, realOuterReceiveBuffer, 0, totalLen); 
sendResponse(requestHandleSocket, realOuterReceiveBuffer,"200 OK", "text/html");
});
} 
最终用lambda表达式实现了

 

 

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

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

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

 

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

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

 

基础知识:

索引的语法:

public string this[string s],通过get、set块来定义取值、赋值的逻辑

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

索引可以重载。

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

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

 

7、属性和public字段的区别是什么?

调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?

属性可以对设值、取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的,极端的例子。Public Age{get{return 100;}set{}}。加分的补充回答:用reflector反编译可以看出,属性内部本质上就是set_***、get_***方法,详细参考传智播客.net培训视频中串讲.net基础的部分。

    class Person

    {

        public int Age

        {

            get

            {

                return 3;

            }

            set

            {

 

            }

        }

    }

            Person p1 = new Person();

            p1.Age = 30;

            p1.Age++;

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

 

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

1、  手写三层架构

三层体系结构的概念
用户界面表示层(USL)
业务逻辑层(BLL)
数据访问层(DAL)

2、  手写冒泡排序

3、 

4、  手写AJAX:XMLHttpRequest

 

 

 

 

5、  手写增删改查、SQLHelper

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;

 

namespace DAL

{

    public class SQLHelper

    {

      

        private SqlConnection conn =null;

        private SqlCommand cmd = null;

        private SqlDataReader sdr = null;

 

        public SQLHelper()

        {

            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

            conn = new SqlConnection(connStr);

        }

 

        private SqlConnection GetConn()

        {

            if (conn.State==ConnectionState.Closed)

            {

                conn.Open();

            }

            return conn;

        }

 

        /// <summary>

        /// 执行不带参数的增删改查SQL语句或存储过程

        /// </summary>

        /// <param name="cmdText">不带参数的增删改查SQL语句或存储过程</param>

        /// <param name="ct">命令类型</param>

        /// <returns></returns>

        public int ExecuteNonQuery(string cmdText,CommandType ct)

        {

            int res;

            using (cmd = new SqlCommand(cmdText, GetConn()))

            {

                cmd.CommandType = ct;

                res = cmd.ExecuteNonQuery();

            }

            return res;

        }

 

        /// <summary>

        /// 执行带参数的SQL增删改查或存储过程

        /// </summary>

        /// <param name="cmdText">参数的SQL增删改查或存储过程</param>

        /// <param name="paras">参数集合</param>

        /// <param name="ct">命令类型</param>

        /// <returns></returns>

        public int ExecuteNonQuery(string cmdText,SqlParameter[] paras,CommandType ct)

        {

            int res;

            using (cmd = new SqlCommand(cmdText, GetConn()))

            {

               

                cmd.Parameters.AddRange(paras);

                cmd.CommandType = ct;

                res = cmd.ExecuteNonQuery();

            }

            return res;

        }

       

        /// <summary>

        /// 执行带参数的增删改SQL语句或存储过程

        /// </summary>

        /// <param name="sql">带参数的增删改SQL语句或存储过程</param>

        /// <param name="ct">命令类型</param>

        /// <returns></returns>

        public DataTable ExecuteQuery(string cmdText,CommandType ct)

        {

            DataTable dt = new DataTable();

            cmd = new SqlCommand(cmdText, GetConn());

            cmd.CommandType = ct;

            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

            {

                dt.Load(sdr);

            }

            return dt;

        }

       

       /// <summary>

        /// 执行带参数的SQL查询语句

       /// </summary>

        /// <param name="cmdText">带参数的SQL查询语句</param>

        /// <param name="paras">参数集合</param>

       /// <param name="ct">执行类型</param>

        /// <returns>DataTable</returns>

        public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras,CommandType ct)

        {

            DataTable dt = new DataTable();

            cmd = new SqlCommand(cmdText, GetConn());

            cmd.Parameters.AddRange(paras);

            cmd.CommandType = ct;

            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

            {

                dt.Load(sdr);

            }

            return dt;

        }

 

        /// <summary>

        /// ExecuteScalar--返回首行首列

        /// </summary>

        /// <param name="XSqlString">sql语句</param>

        /// <returns>返回结果集的首行首列</returns>

        public int GetRecordCount(string XSqlString)

        {

            string SCount;

 

            SqlCommand Cmd = new SqlCommand(XSqlString, GetConn());

            SCount = Cmd.ExecuteScalar().ToString().Trim(); //返回结果集的首行首列,忽略其它

            if (SCount == "")

                SCount = "0";

 

            return Convert.ToInt32(SCount);

        }

    }

}

 

 

 

 

 

 

 

8、三层架构

通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。

区分层次的目的即为了“高内聚,低耦合”的思想。

表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。

业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

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

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

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

缺点: 增加成本。

 

10、关于拆箱装箱:

1)什么是装箱(boxing)和拆箱(unboxing)(*

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

 

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

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

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

            object obj = null;//引用类型

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

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

 

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

int i=10;

object obj = i;

int j = obj;

 

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

3 int j = (int)obj;   

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

    NET重要技术和基础之一的CTS(Common Type System)。CTS是为了实现在应用程序声明和使用这些类型时必须遵循的规则而存在的通用类型系统。.Net将整个系统的类型分成两大类 :值类型和引用类型。

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

(*)

object.ReferenceEquals();//用来判断两个对象是否是同一个对象

Console.WriteLine(object.ReferenceEquals(3,3));//因为两个3被装到了两个箱子中,所以是false

 

Equals ==的关系

 

12、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: newobj instance void 索引.C1::.ctor()

C#中是new C1();VB.net中是 Dim c1 As New C1

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

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

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

 

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

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

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

结构实现接口 C#中类与结构的区别  

2011-04-22 18:30:41|  分类: .net |  标签: |举报 |字号大中小 订阅

一.类与结构的示例比较:
  结构示例:
  public struct Person
  {
  string Name;
  int height;
  int weight
  public bool overWeight()
  {
  //implement something
  }
  }
  类示例:
  public class TestTime
  {
  int hours;
  int minutes;
  int seconds;
  public void passtime()
  {
 //implementation of behavior
  }
  }
  调用过程:
  public class Test
  {
  public static ovid Main
  {
  Person Myperson=new Person //声明结构
  TestTime Mytime=New TestTime //声明类
  }
  }
  从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面
是struct 还是class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常
类似。那么类和结构的具体区别是什么呢?
  二.类与结构的差别
  1.值类型与引用类型
  结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:in
t 对应System.int32 结构,string 对应system.string 结构 ,通过使用结构可以创
建更多的值类型
  类是引用类型:引用类型在堆上分配地址
  堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑
复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之
间的赋值只是复制引用
  注:
  1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类
型的基类型都是object
  2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆
上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,
且对象不可用
  2.继承性
  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的
用sealed声明,可是结构是隐式的sealed .
  类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也
能被继承
  注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
  例如:结构实现接口
  interface IImage
  {
        void Paint();
  }
  struct Picture : IImage
  {
        public void Paint()
        {
           //painting code goes here
        }
        private int x, y, z;// other struct members
  }
  3.内部结构:
  结构:
  没有默认的构造函数,但是可以添加构造函数
  没有析构函数
  没有abstract 和sealed(因为不能继承)
  不能有protected 修饰符
  可以不使用new 初始化
  在结构中初始化实例字段是错误的
  类:
  有默认的构造函数
  有析构函数
  可以使用abstract 和sealed
  有protected 修饰符
  必须使用new 初始化
  三.如何选择结构还是类
  讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
  1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
  2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
  3.在表现抽象和多级别的对象层次时,类是最好的选择
  4.大多数情况下该类型只是一些数据时,结构是最佳的选择

 

 

14、堆和栈的区别?

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

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

 

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

需要实现IEnumerable接口或声明GetEnumerator方法的类型。

 

16、GC是什么? 为什么要有GC? 

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

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

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

 

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

            object obj = new object();//只有new才会有新对象

            Console.WriteLine(obj);

 

            object obj2 = obj;

            obj = null;

            obj2 = null;

            Console.WriteLine();

 

 

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

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

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

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

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

 

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

 

不同点:

不能直接实例化接口。

接口不包含方法的实现。

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

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

 

相同点:

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

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

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

 

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

 

20 什么是接口,接口有什么作用。

什么是接口?
接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为
接口是这样定义的: 接口,里面包含方法,但是没有方法的具体实现。
然后在继承该接口的类中 去实现接口中的所有方法。包括 属性、方法、事件、索引器,但是不能包括字段;
接口中只能包含 属性、方法、事件、索引器;
接口可以实现C# 中的多继承。(c#不可以多继承,用接口可以实现) 接口可以继承接口,可以继承多个接口;
 类可以继承接口,但是继承的类必须去实现接口中的方法代码。
接口不能直接被实例化
接口一般不用什么修饰符,因为接口默认的修饰符是 public 公共的。
接口中的所有成员默认为public,因此接口中不能有private修饰符

接口的好处(作用):

  对类的一种约束。
如果一个项目的需求可能在不断变化的情况下,用接口可以很容易进行拓展,并不影响以前写的功能模块的代码,只要新添加类,继承这个接口就可以了。
如果每个类都要用到一些公用的属性字段或者方法,则通过继承接口可以方便的实现,不用再每个类中都写一次公用的属性或方法。
 接口中不能包含【常量、字段(域)、构造函数、析构函数、静态成员】

抽象类(abstract)和接口(interface)的区别:

  abstract 类 和接口类似,
抽象类中定义方法,只有方法名,但不包含主体,不包含实现,和接口一样,
  可以把抽象方法当作没有具体实现的虚方法。
  抽象类不能被实例化。这个接口一样,
  抽象类中并非一定有抽象方法,但是 有抽象方法的类, 一定是抽象类。
  派生类必须覆盖基类的抽象方法,(也就是子类去实现继承类中的方法)
  抽象类中可以包含:属性、普通方法、可以包含虚方法、抽象方法

 

 

20、abstract class抽象类 和interface(接口)有什么区别?

 

相同点:

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

不同点:

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

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

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

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

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

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

接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 就
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

21、是否可以继承String类?

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

 

22

        static void Main(string[] args)

        {

            Console.WriteLine(GetIt());

            Console.ReadKey();

        }

 

        static int GetIt()

        {

            int i = 8;

            try

            {

                i++;

                Console.WriteLine("a");

                return i;//把返回值设定为i,然后“尽快”返回(没啥事就回去吧)

            }

            finally

            {

                Console.WriteLine("b");

                i++;

            }

        }

上面程序的执行结果是ab9

 

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

会执行,在return后执行。

 

        static void Main(string[] args)

        {

            //Console.WriteLine(GetIt());

            Console.WriteLine(GetPerson().Age);

            Console.ReadKey();

        }

 

        static Person GetPerson()

        {

            Person p = new Person();

            p.Age = 8;

            try

            {

                p.Age++;

                Console.WriteLine("a");

                return p;//把返回值设定为i,然后“尽快”返回(没啥事就回去吧。搞完就走)

            }

            finally

            {

                Console.WriteLine("b");

                p.Age++;

            }

        }

 

 

加分的补充回答(也助记):读取数据库中数据的条数的程序

public int QueryCount()

{

   …..

   try

   {

      return cmd.ExecuteScalar();

   }

   finally

   {

      cmd.Dispose();

   }

}

先执行cmd.ExecuteScalar(),把返回值暂时存起来,然后再去执行finally(钱放在这,我去劫个色),然后把返回值返回。return都是最后执行,但是return后的表达式的计算则是在finally之前。

 

如果C#设计的是先执行cmd.Dispose()再执行return就会出现return执行失败了,因为cmd已经Dispose了。

 

 

28、int、DateTime、string是否可以为null?

 

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

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

Sex is zero。《色即是空》

 

            //int i1 = null;

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

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

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

            //int? i5 = i4;//一定会成功!

 

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

 

 

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

 

            Nullable<int> d1 = new Nullable<int>();//int? d1=null;

            Nullable<int> d2 = new Nullable<int>(3);//int? d2=3;

            Console.WriteLine(d1==null);

 

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

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

            int i1 = 3;

            int? i2 = i1;

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

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

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

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

 

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

using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。

 

30、XML 与 HTML 的主要区别

1. XML是区分大小写字母的,HTML不区分。

2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束 标记。在XML中,绝对不能省略掉结束标记。

HTML:<img src="1.jpg"><br><br>

XML:<img src="1.jpg"></img><br/><br/>

3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。

4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。

5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

 

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

HTML是用来显示数据的

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

 

31、string str = null 与 string str =””说明其中的区别。

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

 

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

 

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

答:解1: select top 10 * from A where id not in (select top 30 id from A)

演变步骤:

1)select top 30 id from T_FilterWords--取前条

 

2)select * from T_FilterWords

where id not in (select top 30 id from T_FilterWords)--取id不等于前三十条的

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

 

3)select top 10 * from T_FilterWords

where id not in (select top 30 id from T_FilterWords)

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

 

解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

解答3:用ROW_NUMBER实现

 

33.面向对象的语言具有________性、_________性、________

答:封装、继承、多态。

不要背,脑子中要有联想。

 

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

答:[serializable]

 

35、什么是code-Behind技术。

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

 

36、接口是一种引用类型,在接口中可以声明(   a),但不可以声明公有的域或私有的成员变量。  
  a) 方法、属性、索引器和事件;  

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

 

解读:接口中不能声明字段只能声明方法,属性、索引器和事件 最终都编译生成方法。因为字段属于实现层面的东西,只有存取值的时候才会用到字段,所以中接口中不能定义字段。

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

 

拿SQLHelper实现一下。


38. 下列关于C#中索引器理解正确的是(c   )  
  a) 索引器的参数必须是两个或两个以上  
  b) 索引器的参数类型必须是整数型  
  c) 索引器没有名字  
  d) 以上皆非  

39. 下面关于XML的描述错误的是(d)。  
  a) XML提供一种描述结构化数据的方法;  
  b) XML   是一种简单、与平台无关并被广泛采用的标准;  
  c) XML文档可承载各种信息;  
  d) XML只是为了生成结构化文档;  


40、以下的C#代码,试图用来定义一个接口: 
  public   interface   IFile  
  {  
              int   A;  
              int   delFile()  
              {  
                      A   =   3;  
              }  
              void   disFile();  
  }  
  关于以上的代码,以下描述错误的是(d   )。  
  a) 以上的代码中存在的错误包括:不能在接口中定义变量,所以int   A代码行将出现错误;  
  b) 以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数;  
  c) 代码void   disFile();声明无错误,接口可以没有返回值;  
  d) 代码void   disFile();应该编写为void   disFile(){};  



41、在ASP.NET中有Button控件myButton,要是单击控件时,导航到其他页面http://www.abc.com,   正确的代码为(   c) 
 a) private   void   myButton_Click(object   sender,   System.EventArgs   e){Redirect(“http://www.abc.com”);}  
 b) private   void   myButton_Click(object   sender,   System.EventArgs   e){Request.Redirect(“http://www.abc.com”);}  
c) private   void   myButton_Click(object   sender,   System.EventArgs   e){Reponse.Redirect(“http://www.abc.com”);}  

d) private   void   myButton_Click(object   sender,   System.EventArgs   e){Request.Redirect(“http://www.abc.com”);return   true;}  

42. 声明一个委托public   delegate   int   myCallBack(int   x);   则用该委托产生的回调方法的原型应该是(b   )。  
  a) void   myCallBack(int   x)   ;  
  b) int   receive(int   num)   ;  
  c) string   receive(int   x)   ;  
  d) 不确定的;  

43.StringBuilder String 的区别?

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

 如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。 

 

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

 

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

一个ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下

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

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

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

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

最简单的说,隐藏类里有个验证码类,你在WEB页面想用就可以直接调用,而不需要在每个需要验证码类的页面编,这样可以结省代码量,还可以随时修改类,从而实现各个页面的同步

 

 

 

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

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

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

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

 

 

 

1、在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。 

string str = null 是不给他分配内存空间,而string str = “”给它分配长度为空字符窜的内存空间. 

2、请详述在dotnet中类(class)与结构(struct)的异同:(10分) 

Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的. 

3、根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:(10) 

namespace test 

public delegate voidonDBOperate(); 

public class UserControlBase : System.Windows.Forms.UserControl 

public eventonDBOperateonNew; 

privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e) 

if(e.Button.Equals(BtnNew)) 

//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。 

____________________________________________________________________ 

if(onNew != null 

OnNew( this, e ); 

4、分析以下代码,完成填空(10分) 

string strTmp = "abcdefg某某某"; 

int i= System.Text.Encoding.Default.GetBytes(strTmp).Length; 

int j= strTmp.Length; 

以上代码执行完后,i= j= i还真的不知道, j=10 

5、SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号。(10) 

select top ID from table1 order by LastUpdateData desc 

8、简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。(10) 

remoting是.net 中用来跨越machine, process, appdomain 进行方法调用的技术,对于三成结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM Web Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。Web Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型 

9.什么叫做SQL注入,如何防止?请举例说明。 

利用sql关键字对网站进行攻击。过滤关键字??等 

所谓SQL注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。 

http://localhost/lawjia/show.asp?ID=444 and user>0,这时,服务器运行Select * from 表名 where 字段=444 and user>0这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下: 

  ·错误类型: 

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07) 

[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 ??sonybb?? 转换为数据类型为 int 的列时发生语法错误。 

10 产生一个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++) 

intArr=(int)myList; 

 

11请解释ASPNET中的web页面与其隐藏类之间的关系?

一个ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下 Codebehind="Tst1.aspx.cs" 表明经编译此页面时使用哪一个代码文件

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

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

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

13当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决

很有可能是在Page_Load中数据处理时没有进行PageIsPostBack属性判断

14请解释什么是上下文对象,在什么情况下要使用上下文对象

上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction)时就要以使用此对象

15请解释转发与跳转的区别?

转发就是服务端的跳转A页面提交数据到B页面,B页面进行处理然后从服务端跳转到其它页面

跳转就是指客户端的跳转

16.请简述一下用Socket进行同步通讯编程的详细步骤

1、在应用程序和远程设备中使用协议和网络地址初始化套接字

2、在应用程序中通过指定端口和地址建立监听

3、远程设备发出连接请求

4、应用程序接受连接产生通信scoket

5、应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束)

6、通讯结束,关闭应用程序和远程设备的Socket回收资源

17.请叙述类与结构的区别。

  1)、结构是值类型;

  2)、结构不支持继承;

  3)、结构不能定义默认的构造函数;

  4)、结构不能定义析构函数;

  5)、结构不能使用初始值设置域值。

 

10 .请解释ASPNET中以什么方式进行数据验证

       Aps.net 中有非空验证,比较验证,取值范围验证,正则表达式验证及客户自定义验证五大控件,另还有一个集中验证信息处理控件

11  WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。

web控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用Page_Load事件,然后根据传回的状态信息自动调用服务端事件自动传回是当我们在点击客户端控件时,采用提交表单的形式将数据直接传回到务端

只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务端事件

12  WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?

可以调用

例如:<asp:TextBox id="TextBox1" onclick="clientfunction();" runat="server">

</asp:TextBox>

<INPUT id="Button2" value="Button" name="Button2"

runat="server" onclick="clientfunction();">

13  请解释web.config文件中的重要节点

appSettings包含自定义应用程序设置。

system.web 系统配置

compilation动态调试编译设置

customErrors自定义错误信息设置

authentication身份验证,此节设置应用程序的身份验证策略。

authorization授权, 此节设置应用程序的授权策略.

14  请解释ASPNET中的web页面与其隐藏类之间的关系?

一个ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下

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

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

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

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

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

16  当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决

很有可能是在Page_Load中数据处理时没有进行PageIsPostBack属性判断

17  请解释什么是上下文对象,在什么情况下要使用上下文对象

上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction)时就要以使用此对象

18  请解释转发与跳转的区别?

转发就是服务端的跳转A页面提交数据到B页面,B页面进行处理然后从服务端跳转到其它页面

跳转就是指客户端的跳转

1.请简述一下用Socket进行同步通讯编程的详细步骤

1、在应用程序和远程设备中使用协议和网络地址初始化套接字

2、在应用程序中通过指定端口和地址建立监听

3、远程设备发出连接请求

4、应用程序接受连接产生通信scoket

5、应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束)

6、通讯结束,关闭应用程序和远程设备的Socket回收资源

1、在C#中,string   str   =   null      string   str   =   “”   请尽量使用文字或图象说明其中的区别。  

  string   str   =   null   是不给他分配内存空间,string   str   =   “”给它分配长度为空字符窜的内存空间.      

  2、请详述在dotnet中类(class)与结构(struct)的异同:(10)  

  Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.      

  3、根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:(10)    

  namespace   test  

  {  

  public   delegate   void   OnDBOperate();  

  public   class   UserControlBase   :   System.Windows.Forms.UserControl    

  {  

  public   event   OnDBOperate   OnNew;  

  privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs   e)  

  {  

  if(e.Button.Equals(BtnNew)) 

 

/请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。                                                                                                         

  }  

  }  

  }  

  }  

  ____________________________________________________________________  

  if(   OnNew   !=   null   )  

  OnNew(   this,   e   );      

  4、分析以下代码,完成填空(10)  

  string   strTmp   =   "abcdefg某某某";  

  int   i=   System.Text.Encoding.Default.GetBytes(strTmp).Length;  

  int   j=   strTmp.Length;  

  以上代码执行完后,i=                                   j=   i还真的不知道,   j=10      

  5SQLSERVER服务器中,给定表   table1   中有两个字段   IDLastUpdateDateID表示更新的事务号,   LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号。(10)  

  select   top   ID   from   table1   order   by   LastUpdateData   desc     

  8、简要谈一下您对微软.NET   构架下remotingwebservice两项技术的理解以及实际中的应用。(10)  

  remoting.net   中用来跨越machine,   process,   appdomain   进行方法调用的技术,对于三成结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM  Web   Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。Web   Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型 

9.什么叫做SQL注入,如何防止?请举例说明。

利用sql关键字对网站进行攻击。过滤关键字''

所谓SQL注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。

http://localhost/lawjia/show.asp?ID=444 and user>0,这时,服务器运行Select * from 表名 where 字段=444 and user>0这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下:

  ·错误类型:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)

[Microsoft][ODBC SQL Server Driver][SQL Server] nvarchar ''sonybb'' 转换为数据类型为 int 的列时发生语法错误。

a 产生一个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++)

intArr[i]=(int)myList[i];

       20.请叙述类与结构的区别。

  1)、结构是值类型;

  2)、结构不支持继承;

  3)、结构不能定义默认的构造函数;

  4)、结构不能定义析构函数;

  5)、结构不能使用初始值设置域值。

 

 

 

 

50. 不定项选择:

(1) 以下叙述正确的是: B C

A. 接口中可以有虚方法。B. 一个类可以实现多个接口。 C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。

(2) 从数据库读取记录,你可能用到的方法有:B C D

      A. ExecuteNonQuery            B. ExecuteScalar      C. Fill                        D. ExecuteReader

(3).对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选)   (        ABCD         )  

  A.Close B.Dispose C.Finalize  

  D.using E.Quit  

(4)以下关于ref和out的描述哪些项是正确的?(多选)   (    ACD   )  

  A.使用ref参数,传递到ref参数的参数必须最先初始化。  

  B.使用out参数,传递到out参数的参数必须最先初始化。  

  C.使用ref参数,必须将参数作为ref参数显式传递到方法。  

  D.使用out参数,必须将参数作为out参数显式传递到方法。 

 

51. 单项选择:

(1)下列选项中,(C)是引用类型。

a)enum类型   b)struct类型 c)string类型   d)int类型

 

(2).关于ASP.NET中的代码隐藏文件的描述正确的是(C)

a)Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名。

b)项目中所有Web窗体页的代码隐藏文件都被编译成.EXE文件。

c)项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。

d)以上都不正确。

 

(3).下列描述错误的是(D)

a)类不可以多重继承而接口可以;

b)抽象类自身可以定义成员而接口不可以;

c)抽象类和接口都不能被实例化;

d)一个类可以有多个基类和多个基接口;

 

52、DataReader和DataSet的异同?

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

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

是只进的、 只读的

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

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

 

53、public static const int  A = 1;这段代码有错误么?

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

 

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

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

 

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

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

 

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

System.Object

 

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

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

 

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

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

 

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

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

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

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

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

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

 

60、不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?(传智播客.Net培训班原创模拟题)

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

 

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

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

 

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

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

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

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

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

 

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

开源项目有一些是开发包。开源软件指的是可以直接用的。Jquery、NPOI、ASP.Net MVC、Silverlight  Toolkit、AJAX toolkit、json.net

 

得瑟!

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

参考复习ppt。

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

public FileManager

{

    private FileManager(){}

    public readonly static FileManager Instance = new FileManager();

}

 

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

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

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

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

1' or 1=1

 

67、数据库三范式是什么?

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

传智播客风格的非严谨却一下子明了的解答方式:

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

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

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

 

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

 

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

 

72、post、get的区别

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

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

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

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

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

 参考阅读:http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html

 

73、下面的程序执行结果是什么?(传智播客.Net培训班原创模拟题)

    class Person

    {

        public int Age { get; set; }

    }

            int i1 = 20;

            int i2 = i1;

            i1++;

            Console.WriteLine(i2);

 

            Person p1 = new Person();

            p1.Age = 20;

            Person p2 = p1;

            p1.Age++;

            Console.WriteLine(p2.Age);

答案:

20

21

 

解释:引用类型和值类型的区别。

 

76、下面程序的执行结果是什么?(传智播客.Net培训班原创模拟题)

            int i = 10;

            Console.WriteLine(i++);

            Console.WriteLine(++i);

           Console.WriteLine(i=20);

            Console.WriteLine(i==20);

答案:

10

12

20

True       

解答:前两个参考第80题,i++表达式的值为i自增之前的值,所以打印10,执行完成后i变成11,执行++i的时候表达式的值为自增以后的值12。C#中赋值表达式的值为变量被赋值的值,因此最后一个就输出i赋值后的值20

while((line=reader.ReadLine())!=null)

{

}

 

下面程序的执行结果是什么?

bool b=false;

if(b=true)

{

    Console.WriteLine("yes");

}

else

{

    Console.WriteLine("no");

}

 

78、下列哪个名词和WebService不直接相关?(B)(传智播客.Net培训班原创模拟题)

A、UDDI

B、GUID

C、WSDL

D、SOAP

 

WebService解决的三个问题:接口的自我描述;采用Http协议等常规协议,不用写原始的Socket;基于Web服务器,不占用80端口之外的端口。

 

UDDI用来自动发现WebService的协议(*)

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

 

WSDL(WebService Defination Language)是对WebService上的方法名、参数进行描述的协议。对接口的自描述。

SOAP(Simple Object Access Protocol)是对参数、返回值以什么样的格式进行传递进行描述的协议。对报文的格式规范。

 

实际工作中应该是自己调用别人的WebService或者别人调用自己的WebService,沟通语言就是WSDL,拿到WSDL什么都不用操心。

 

WebService是跨平台、跨语言调用,可以跨防火墙;缺点:效率低。所以适用于两个非内部系统的通讯(比如炒股软件和证券交易所之间的通讯)

 

WCF是对WebService、Socket、MQ等通讯方式的一个统一,底层还是采用这些通信协议,可以简化这些程序的开发,不用再换不同通信协议的时候重写代码并且学一堆新的技术。所以WCF和WebService不是一个竞争取代关系。

 

WCF是对.Net Remoting、WebService、MQ等通讯方式的一个高级封装,让我们开发不同通讯协议的程序的时候很简单,不用学更多的东西。并不是替代.Net Remoting、WebService、MQ这些东西。

 

81、.Net、ASP.Net、C#、VisualStudio之间的关系是什么?(传智播客.Net培训班原创模拟题)

答:.Net一般指的是.Net Framework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调用,.Net Framework还提供了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,VisualStudio Express版这个免费版本。

 

82、AJAX解决什么问题?如何使用AJAX?AJAX有什么问题需要注意?项目中哪里用到了AJAX?(传智播客.Net培训班原创模拟题)

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

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

UpdatePanel的内部原理。

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

在如鹏网项目中发帖的时候显示相关帖的功能、站内搜索项目中显示搜索Suggestion、数据采集项目中都用到了AJAX。

 

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

 

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

 

多准备几把斧子!上来找一切机会甩斧子!

 

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

答:Application是用来存取整个网站全局的信息,

而Session是用来存取与具体某个访问者关联的信息。

Cookie是保存在客户端的,机密信息不能保存在Cookie中,只能放小数据;Session是保存在服务器端的,比较安全,可以放大数据。

 

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

 

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

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

 

86、你对.net的GC的理解

GC是.Net的垃圾收集器,可以进行内存资源的回收,程序员无需关心资源的回收,当一个对象没有任何引用的时候就可以被回收了。一个对象可以被回收并不意味着一定会被立即回收,GC会选择时机进行回收。可以调用GC.Collect()让GC立即回收。GC不能回收非托管资源,对于非托管资源一般都实现了IDisposable接口,然后使用using关键字进行资源的回收。

 

 

87、请写一个SQL语句:从user表中取出name列中的起始字符是“北京”的全部记录

select * from [user] wherer name like '北京%'

 

88、请你简单的说明数据库建立索引的优缺点

使用索引可以加快数据的查询速度,不过由于数据插入过程中会建索引,所以会降低数据的插入、更新速度,索引还会占磁盘空间。

 

101、下面程序的执行结果是什么?

    public struct Point

    {

        public int x;

        public int y;

        public Point(int x, int y)

        {

            this.x = x;

            this.y = y;

        }

    }

            Point p1 = new Point(100, 100);

            Point p2 = p1;

            p1.x = 200;

            Console.WriteLine("{0},{1}", p1.x, p2.x);

答案:

200,100

 

解答:结构体是复制传递的。

 

扩展:为啥this.Size.Width = 100;编译不通过。

 

106、不用JQuery等框架实现AJAX无刷新登录。(常考)

提示:用纯XMLHttpRequest实现。

 

 

 

 

首先在数据库中就建三个字段的表用来存储用户名和评论信息,Id只是为了设置唯一标示,所以设置成整型自增字段就行了。

 

 

 

再建一个HTML页面,只需简单的拉几个html控件出来摆着就行,注意在页面顶部有个<table>标签用来占位输出评论内容。

 

Html页面代码就这样简单就行了:

 

<body><table id="room">

</table>

<div>

    用户名:<input id="Text1" type="text" /><br />

    信息:<textarea id="TextArea1" cols="20" name="S1" rows="5"></textarea><br />

    <input id="Button1" type="button" value="提交" /></div>

</body> 

然后再页面刚加载的时候,需要从数据库中显示出已有的评论,所以建个后台一般处理程序,命名为:bodyload.ashx。这个后台处理程序就是读取数据库中的所有评论信息,加载到显示页面,当然我这里只是简单的利用|标记来区别每个用户的评论,用@标记来区分用户名和信息,所以不是很严谨。数据操作使用的是强类型的DataSet

获取所有评论信息后台处理代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using _20100921Web.DataSetMsgTableAdapters;

using System.Text;

namespace _20100921Web

{

    /// <summary>

    /// bodyload 的摘要说明

    /// </summary>

    public class bodyload : IHttpHandler

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text/plain";

            T_MsgTableAdapter adapter = new T_MsgTableAdapter();

 

            StringBuilder sb = new StringBuilder();

            DataSetMsg.T_MsgDataTable table = adapter.GetData();

            foreach (var v in table)

            {

                sb.Append(v.Username);

                sb.Append("@");

                sb.Append(v.Message);

                sb.Append("|");

            }

            String result = sb.ToString();

            context.Response.Write(result);

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

 

前台调用JQuery代码在页面加载时进行读取评论,这里就用到了JQuery中的AJAX了,其实也非常简单,就只是调用JQuery中的$.post()方法就可以实现了,该方法实质还是调用了$.ajax()的方法。

 

前台JQuery代码如下:

 

$.post("bodyload.ashx", function (data, state) {

                if (state == "success") {

                    var msgArr = data.split("|");

                    for (var i = 0; i < msgArr.length; i++) {

                        if (msgArr[i].length == 0) {

                            return;

                        }

                        var msg = msgArr[i].split("@");

                        var res = "<tr><td>" + msg[0] + "说:</td><td>" + msg[1] + "</td></tr>";

                        $("#room").append(res);

                    }

                }

            });

然后来处理每一次用户输入后的插入数据及在页面无刷新更新显示评论内容,需要另外添加一个后台处理一般程序,命名为:update.ashx,用来在后台插入数据到数据库中。 

后台处理代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using _20100921Web.DataSetMsgTableAdapters;

namespace _20100921Web

{

    /// <summary>

    /// update 的摘要说明

    /// </summary>

    public class update : IHttpHandler

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text/plain";

            String username = context.Request["username"];

            String msg = context.Request["msg"];

 

            T_MsgTableAdapter adapter = new T_MsgTableAdapter();

            adapter.Insert(username, msg);

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

最后就是在前台将数据传到后台插入,并将评论信息进行更新:

$("#Button1").click(function () {

                var username = $("#Text1").val();

                var msg = $("#TextArea1").text();

                $.post("update.ashx", { "username": username, "msg": msg }, function (data, states) {

                    if (states == "success") {

                        var res = "<tr><td>" + username + "说:</td><td>" + msg + "</td></tr>";

                        $("#room").append(res);

                    }

                })

            })

107、Http状态码各是什么意思。

301(永久重定向)、302 :重定向
404 :页面不存在

500:服务器内部错误

一、HTTP码应码
响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。

响应码分五种类型,由它们的第一位数字表示:
1.1xx:信息,请求收到,继续处理
2.2xx:成功,行为被成功地接受、理解和采纳
3.3xx:重定向,为了完成请求,必须进一步执行的动作
4.4xx:客户端错误,请求包含语法错误或者请求无法实现
5.5xx:服务器错误,服务器不能实现一种明显无效的请求

下表显示每个响应码及其含义:
100 继续
101 分组交换协
200 OK
201 被创建
202 被采纳
203 非授权信息
204 无内容
205 重置内容
206 部分内容
300 多选项
301 永久地传送
302 找到
303 参见其他
304 未改动
305 使用代理
307 暂时重定向
400 错误请求
401 未授权
402 要求付费
403 禁止
404 未找到
405 不允许的方法
406 不被采纳
407 要求代理授权
408 请求超时
409 冲突
410 过期的
411 要求的长度
412 前提不成立
413 请求实例太大
414 请求URI太大
415 不支持的媒体类型
416 无法满足的请求范围
417 失败的预期
500 内部服务器错误
501 未被使用
502 网关错误
503 不可用的服务
504 网关超时
505 HTTP版本未被支持

二、HTTP头标
头标由主键/值对组成。它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接。

四种不同类型的头标:
1.通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
2.请求头标:允许客户端传递关于自身的信息和希望的响应形式。
3.响应头标:服务器和于传递自身信息的响应。
4.实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。

头标格式:<name>:<value><CRLF>

下表描述在HTTP/1.1中用到的头标
Accept 定义客户端可以处理的媒体类型,按优先级排序;
在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。例如:Accept: image/jpeg,image/png,*/*
Accept-Charset 
定义客户端可以处理的字符集,按优先级排序;
在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。例如:Accept-Charset: iso-8859-1,*,utf-8

Accept-Encoding 定义客户端可以理解的编码机制。例如:Accept-Encoding:gzip,compress
Accept-Language 定义客户端乐于接受的自然语言列表。例如:Accept-Language: en,de

Accept-Ranges 
一个响应头标,它允许服务器指明:将在给定的偏移和长度处,为资源组成部分的接受请求。
该头标的值被理解为请求范围的度量单位。例如Accept-Ranges: bytes或Accept-Ranges: nonea

Age 允许服务器规定自服务器生成该响应以来所经过的时间长度,以秒为单位。
该头标主要用于缓存响应。例如:Age: 30

Allow 一个响应头标,它定义一个由位于请求URI中的次源所支持的HTTP方法列表。例如:Allow: GET,PUT

aUTHORIZATION 
一个响应头标,用于定义访问一种资源所必需的授权(域和被编码的用户ID与口令)。
例如:Authorization: Basic YXV0aG9yOnBoaWw=

Cache-Control 一个用于定义缓存指令的通用头标。例如:Cache-Control: max-age=30
Connection 一个用于表明是否保存socket连接为开放的通用头标。例如:Connection: close或Connection: keep-alive

Content-Base 
一种定义基本URI的实体头标,为了在实体范围内解析相对URLs。
如果没有定义Content-Base头标解析相对URLs,使用Content-Location URI(存在且绝对)或使用URI请求。
例如:Content-Base: Http://www.myweb.com

Content-Encoding 一种介质类型修饰符,标明一个实体是如何编码的。例如:Content-Encoding: zip
Content-Language 用于指定在输入流中数据的自然语言类型。例如:Content-Language: en
Content-Length 指定包含于请求或响应中数据的字节长度。例如:Content-Length:382

Content-Location
指定包含于请求或响应中的资源定位(URI)。
如果是一绝。对URL它也作为被解析实体的相对URL的出发点。
例如:Content-Location: http://www.myweb.com/news

Content-MD5
实体的一种MD5摘要,用作校验和。
发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。
例如:Content-MD5: <base64 of 128 MD5 digest>

Content-Range 
随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。
例如:Content-Range: 1001-2000/5000

Contern-Type 标明发送或者接收的实体的MIME类型。例如:Content-Type: text/html
Date 发送HTTP消息的日期。例如:Date: Mon,10PR 18:42:51 GMT

ETag 一种实体头标,它向被发送的资源分派一个唯一的标识符。
对于可以使用多种URL请求的资源,ETag可以用于确定实际被发送的资源是否为同一资源。
例如:ETag: "208f-419e-30f8dc99"

Expires 指定实体的有效期。例如:Expires: Mon,05 Dec 2008 12:00:00 GMT
Form 一种请求头标,给定控制用户代理的人工用户的电子邮件地址。例如:From: webmaster@myweb.com
Host 被请求资源的主机名。对于使用HTTP/1.1的请求而言,此域是强制性的。例如:Host: www.myweb.com

If-Modified-Since 
如果包含了GET请求,导致该请求条件性地依赖于资源上次修改日期。
如果出现了此头标,并且自指定日期以来,此资源已被修改,应该反回一个304响应代码。
例如:If-Modified-Since: Mon,10PR 18:42:51 GMT

If-Match 如果包含于一个请求,指定一个或者多个实体标记。只发送其ETag与列表中标记区配的资源。
例如:If-Match: "208f-419e-308dc99"

If-None-Match 
如果包含一个请求,指定一个或者多个实体标记。资源的ETag不与列表中的任何一个条件匹配,操作才执行。
例如:If-None-Match: "208f-419e-308dc99"

If-Range
指定资源的一个实体标记,客户端已经拥有此资源的一个拷贝。必须与Range头标一同使用。
如果此实体自上次被客户端检索以来,还不曾修改过,那么服务器只发送指定的范围,否则它将发送整个资源。
例如:Range: byte=0-499<CRLF>If-Range:"208f-419e-30f8dc99"

If-Unmodified-Since
只有自指定的日期以来,被请求的实体还不曾被修改过,才会返回此实体。
例如:If-Unmodified-Since:Mon,10PR 18:42:51 GMT

Last-Modified 指定被请求资源上次被修改的日期和时间。例如:Last-Modified: Mon,10PR 18:42:51 GMT
Location 
对于一个已经移动的资源,用于重定向请求者至另一个位置。
与状态编码302(暂时移动)或者301(永久性移动)配合使用。
例如:Location: http://www2.myweb.com/index.jsp

Max-Forwards 
一个用于TRACE方法的请求头标,以指定代理或网关的最大数目,该请求通过网关才得以路由。
在通过请求传递之前,代理或网关应该减少此数目。例如:Max-Forwards: 3

Pragma 一个通用头标,它发送实现相关的信息。例如:Pragma: no-cache
Proxy-Authenticate
类似于WWW-Authenticate,便是有意请求只来自请求链(代理)的下一个服务器的认证。
例如:Proxy-Authenticate: Basic realm-admin

Proxy-Proxy-Authorization
类似于授权,但并非有意传递任何比在即时服务器链中更进一步的内容。
例如:Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw=

Public 列表显示服务器所支持的方法集。例如:Public: OPTIONS,MGET,MHEAD,GET,HEAD
Range 指定一种度量单位和一个部分被请求资源的偏移范围。例如:Range: bytes=206-5513

Refener
一种请求头标域,标明产生请求的初始资源。对于HTML表单,它包含此表单的Web页面的地址。
例如:Refener: http://www.myweb.com/news/search.html

Retry-After 
一种响应头标域,由服务器与状态编码503(无法提供服务)配合发送,以标明再次请求之前应该等待多长时间。
此时间即可以是一种日期,也可以是一种秒单位。例如:Retry-After: 18

Server 一种标明Web服务器软件及其版本号的头标。例如:Server: Apache/2.0.46(Win32)
Transfer-Encoding 一种通用头标,标明对应被接受方反向的消息体实施变换的类型。例如:Transfer-Encoding: chunked

Upgrade 
允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用。
例如:Upgrade: HTTP/2.0

User-Agent
定义用于产生请求的软件类型(典型的如Web浏览器)。
例如:User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt)

Vary 一个响应头标,用于表示使用服务器驱动的协商从可用的响应表示中选择响应实体。例如:Vary: *
Via 一个包含所有中间主机和协议的通用头标,用于满足请求。例如:Via: 1.0 fred.com, 1.1 wilma.com
Warning 用于提供关于响应状态补充信息的响应头标。例如:Warning: 99 www.myweb.com Piano needs tuning

www-Authenticate
一个提示用户代理提供用户名和口令的响应头标,与状态编码401(未授权)配合使用。响应一个授权头标。
例如:www-Authenticate: Basic realm=zxm.mgmt

 

108、 对html文本框进行赋值的JQuery语句,对html文本框进行取值的JQuery语句,对TextBox服务端控件进行取值的语句JQuery。

摘要: Jquery给基本控件的取值、赋值 TEXTBOX: var str = $('#txt').val(); $('#txt').val("Set Lbl Value"); //文本框,文本区域: $("#text_id").attr("value",'');//清空内容 $("#text_id").attr("value",'test');// 填充内容

Jquery给基本控件的取值、赋值

TEXTBOX: 
var str = $('#txt').val();

 $('#txt').val("Set Lbl Value"); 

  1. //文本框,文本区域:
  2. $("#text_id").attr("value",'');//清空内容
  3. $("#text_id").attr("value",'test');// 填充内容

LABLE:   

var str = $('#lbl').text();

$('#lbl').text("Set Lbl Value");

  1.    var valradio = $("input[@type=radio][@checked]").val();
  2.    var item = $('input[@name=items][@checked]').val();
  3. var checkboxval = $("#checkbox_id").attr("value");
  4.    var selectval = $('#select_id').val();
  5. //多选框checkbox:
  6. $("#chk_id").attr("checked",'');//使其未勾选
  7. $("#chk_id").attr("checked",true);// 勾选
  8. if($("#chk_id").attr('checked')==true) //判断是否已经选中
  9. 单选组radio:
  10.  
  11. $("input[@type=radio]").attr("checked",'2'); //设置value=2的项目为当前选中项
  12.  
  13. //下拉框select:
  14. $("#select_id").attr("value",'test');// 设置value=test的项目为当前选中项
  15. $("<option value='test'>test</option><option value='test2'>test2</option>").appendTo("#select_id")//添加下拉框的 option
  16. $("#select_id").empty();//清空下拉框
  17.  
  18. 获取一组名为 (items)的radio被选中项的值
  19. var item = $('input[@name=items][@checked]').val();//若未被选中 则val() = undefined
  20. 获 取select被选中项的文本
  21. var item = $("select[@name=items] option[@selected]").text();
  22. select下拉框的第二个元素为当前选中值
  23. $('#select_id')[0].selectedIndex = 1;
  24. radio单选组的第二个元素为当前选中值
  25. $('input[@name=items]').get(1).checked = true;
  26.  
  27. //重置表单
  28. $("form").each(function(){
  29.    .reset();
  30. });

摘要: Jquery给基本控件的取值、赋值 TEXTBOX: var str = $('#txt').val(); $('#txt').val("Set Lbl Value"); //文本框,文本区域: $("#text_id").attr("value",'');//清空内容 $("#text_id").attr("value",'test');// 填充内容

Jquery给基本控件的取值、赋值

TEXTBOX: 
var str = $('#txt').val();

 $('#txt').val("Set Lbl Value"); 

  1. //文本框,文本区域:
  2. $("#text_id").attr("value",'');//清空内容
  3. $("#text_id").attr("value",'test');// 填充内容

LABLE:   

var str = $('#lbl').text();

$('#lbl').text("Set Lbl Value");

  1.    var valradio = $("input[@type=radio][@checked]").val();
  2.    var item = $('input[@name=items][@checked]').val();
  3. var checkboxval = $("#checkbox_id").attr("value");
  4.    var selectval = $('#select_id').val();
  5. //多选框checkbox:
  6. $("#chk_id").attr("checked",'');//使其未勾选
  7. $("#chk_id").attr("checked",true);// 勾选
  8. if($("#chk_id").attr('checked')==true) //判断是否已经选中
  9. 单选组radio:
  10.  
  11. $("input[@type=radio]").attr("checked",'2'); //设置value=2的项目为当前选中项
  12.  
  13. //下拉框select:
  14. $("#select_id").attr("value",'test');// 设置value=test的项目为当前选中项
  15. $("<option value='test'>test</option><option value='test2'>test2</option>").appendTo("#select_id")//添加下拉框的 option
  16. $("#select_id").empty();//清空下拉框
  17.  
  18. 获取一组名为 (items)的radio被选中项的值
  19. var item = $('input[@name=items][@checked]').val();//若未被选中 则val() = undefined
  20. 获 取select被选中项的文本
  21. var item = $("select[@name=items] option[@selected]").text();
  22. select下拉框的第二个元素为当前选中值
  23. $('#select_id')[0].selectedIndex = 1;
  24. radio单选组的第二个元素为当前选中值
  25. $('input[@name=items]').get(1).checked = true;
  26.  
  27. //重置表单
  28. $("form").each(function(){
  29.    .reset();
  30. });

 

 

110Session有什么重大BUG,微软提出了什么方法加以解决?(常考)

 

iis中由于有进程回收机制,系统繁忙的话Session会丢失,IIS重启也会造成Session丢失。这样用户就要重新登录或者重新添加购物车、验证码等放到Session中的信息。可以用State  server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。

答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。

 
 
但是(一定要写上,这样才够拽)我认为这不是Bug,只能说是In-Proc方式存储Session的缺陷,缺陷是和Bug不一样的,In-Proc方式存储Session会由服务器来决定什么时候释放Session,这是By Design,In-Proc方式不满足要求的话完全可以用StateServer和数据库的方式。
 
StateServer还可以解决集群Session共享的问题。
 
配置StateServer的方法:
http://support.microsoft.com/kb/317604
http://blog.csdn.net/zj1103/archive/2008/09/14/2926773.aspx
 
 
111、asp.net中<%%>、<%=%>、<%#%>的区别是什么
<%%>是执行<%%>中的C#代码,
<%=%>是将=后表达式的值输出到Response中,
<%#%>是数据绑定,一般用在ListView、GridView、Repeater等控件的绑定中。数据绑定分为:Eval:单向绑定和Bind:双向绑定。

asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别

(2013-05-23 10:12:03)

转载

标签: 

杂谈

分类: htmlcss

1.<% %>用来绑定后台代码

如:

< %

for(int i=0;i<100;i++)

{

Reaponse.Write(i.ToString());

}

%>

2.<%# %> 是在绑定控件DataBind()方法执行时被执行,用于数据绑定

如: < %# Container.DataItem("title") %>

3.<%= %>用来绑定后台的变量或方法且有返回值 的,但此时的变量名或方法的访问修饰符为protected或public

如:<%=name%> <%=getstr()%>

4.<%@ %>用来导入后台命名空间

如:<%@ import namespace="system.data">

5.<%$ %>用来绑定web.config里的字符串(键值对)

如:<asp:TextBox runat="server" ID="cc" Text="<%$ ConnectionStrings:pubs%>"></asp:TextBox>

web.config

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <connectionStrings>
    <add name="pubs" connectionString="Server=.;database=pubs;uid=sa;pwd=" providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

6.DataBind,获得的数据,系统会将其默认为String,怎样转化为其它的类型?

DataBinder.eval_r(Container.DataItem,"转换的类型","格式")  注:格式可以不要 此方法=eval_r("转换的类型")

 

 

113、说说在软件设计中你遇到的以空间换时间的例子?

参考回答:谈Cache(缓存)、索引这些例子。用额外的磁盘、内存空间的消耗来提高执行速度。Lucene.Net也是一个例子。

for(int i=0;i<values.Length;i++)
{
Console.WriteLine(i);
}
时间复杂度O(n)、空间复杂度O(1)。
for(int i=0;i<values.Length/2;i++)
{
Console.WriteLine(i);
}
时间复杂度O(n)、空间复杂度O(1)。不要常数、N*N>N。

for(int i=0;i<values.Lenght;i++)
{
for(int i=0;i<values.Lenght;i++)
{

}
}

 

114、asp.net中的错误机制。(常考)

参考:

1Web config设置
<?xml version="1.0"?>
    <configuration>
  <system.web>
  <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
  <error statusCode="403" redirect="Error403.htm" />
  <error statusCode="404" redirect="Error404.htm" /> 
  </customErrors>
  </system.web>
  </configuration>
2Global.asax设置
  protected void Application_Error(object sender, EventArgs e) {
  Exception objErr = Server.GetLastError().GetBaseException();
  Response.Write("Error:" + objErr.Message);
  Server.ClearError();
  }
3,使用ErrorPage属性
 <script language="C#" runat="server">
  protected void Page_Load(object sender, EventArgs e) {
        this.ErrorPage = "ErrorPage.htm";
        }  
  </script>
4
,使用Page_Error事件处理方法
  protected void Page_Error(object sender, EventArgs e) {
  Exception objErr = Server.GetLastError().GetBaseException();
  Response.Write("Error:" + objErr.Message);
  Server.ClearError(); //同样要注意这句代码的使用
  } 

根据优先级从高到低排序:Page_Error事件处理方法 > ErrorPage属性 > Application_Error事件处理方法 >  <customErrors>配置项。

定制错误页来将显示一个友好的报错页面。
页面中未捕获一样会触发Page_Error(不常用),应用程序中的未捕获异常会触发Application_Error。通过HttpContext.Current.Server.GetLastError()、HttpContext.Current.Error;拿到未捕捉异常,记录到Log4Net日志中。

 

115、不用中间变量交换两个变量(常考)

 

            i = i + j;//i=30

            j = i - j;//j=10;

            i = i - j;//i=20;

 

            Console.WriteLine("i={0},j={1}",i,j);

另外一个解决方案:位运算。

int   a=5;
int   b=6;

a=a^b;  
b=b^a;   //b^a相当于   b^a^b   也就是   b^a^b的值就是a了,   下边相同  
a=a^b;  

 

下面的SQL题是常考题中的常考题,必须重视!!!!!!!!

 

116、横表、纵表转换(常考!!!)

1)纵表结构 TableA 

Name

Course

Grade

张三

语文

75

张三

数学

80

张三

英语

90

李四

语文

95

李四

数学

55

 横表结构 TableB

Name

语文

数学

英语

张三

75

80

90

李四

95

55

0

先理解:

select Name,

 (case Course when ‘语文‘ then Grade else 0 end) as 语文,

 (case Course when ‘数学‘ then Grade else 0 end) as 数学,

 (case Course when ‘英语‘ then Grade else 0 end) as 英语

from TableA

然后理解标准答案:

select Name,

sum(case Course when ‘语文‘ then Grade else 0 end) as 语文,

sum(case Course when ‘数学‘ then Grade else 0 end) as 数学,

sum(case Course when ‘英语‘ then Grade else 0 end) as 英语

from TableA

group by Name 

2)、横表转纵表的"SQL"示例
横表结构: TEST_H2Z
      ID      姓名    语文        数学       英语      
      1       张三     80         90         70            
      2       李四     90         85         95          
      3       王五     88         75         90          
 
转换后的表结构:  
      ID     姓名     科目     成绩  
      1       张三     语文     80  
      2       张三     数学     90  
      3       张三     英语     70  
      4       李四     语文     90  
      5       李四     数学     80    
      6       李四     英语     99  
      7       王五     语文     85  
      8       王五     数学     96  
      9       王五     英语     88  


横表转纵表SQL示例:
SELECT   姓名,'语文'   AS     科目,语文   AS   成绩   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'数学'   AS     科目,数学   AS   成绩   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'英语'   AS     科目,英语   AS   成绩   FROM   TEST_H2Z
ORDER BY 姓名,科目 DESC;

 

117、删除姓名、年龄重复的记录(只保留Id最大的一条)(常考!!!)

Id  name  age  salary

1   yzk    80  1000

2   yzk    80  2000

3   tom    20  20000

4   tom    20  20000

5   im     20  20000

 

//取得不重复的数据

select * from Persons

where Id in

(

SELECT     MAX(Id) AS Expr1

FROM         Persons

GROUP BY Name, Age

)

 

根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。

 

删除重复的数据:

delete from Persons

where Id not in

(

SELECT     MAX(Id) AS Expr1

FROM         Persons

GROUP BY Name, Age

)

 

尽可能的得瑟!

 

118、介绍几个使用过的开源的项目

Lucene.net、NPOI、JQuery、ASP.Net AJAX  toolkit、Quartz.Net、JqueryUI、ASP.Net MVC。在CodePlex、SourceForge等网站上有更多的开源项目。

 

119、说出五个集合类

List、Dictionary、Set、Stack(先入后出)、Queue(先入先出)、Tree等。

 

解答:HashSet用于盛放不同的数据,相同的数据只保留一份

 

120有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3}

工程化的非最优解答:用HashSet或者List

            int[] values = { 3, 5, 9, 8, 10, 5, 3 };

            HashSet<int> set = new HashSet<int>();

            foreach (int i in values)

            {

                set.Add(i);

            }

            Console.WriteLine(set.Count);

 

 

122下面是一个由*号组成的4行倒三角形图案。要求:1、输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”;2、在屏幕上打印这个指定了行数的倒三角形。

*******

*****

***

*

123、一个文本文件含有如下内容:

4580616022644994|3000|赵涛

4580616022645017|6000|张屹

4580616022645090|3200|郑欣夏

上述文件每行为一个转账记录,第一列表示帐号,第二列表示金额,第三列表示开户人姓名。

创建一张数据库表(MS SQLServer数据库,表名和字段名自拟),请将上述文件逐条插入此表中。

124、一个文本文件含有如下内容,分别表示姓名和成绩:

张三 90

李四 96

王五 78

赵六 82

 

提供用户一个控制台界面,允许用户输入要查询的姓名,输入姓名并且按回车以后,打印出此人的成绩,如果不输入姓名直接按回车则显示所有人的姓名以及成绩。(注意:不能使用数据库)

126、下面程序的执行结果是什么?

class Person

    {

       public DateTime BirthDay = DateTime.Now;

    }

        static void Main(string[] args)

        {

            Person p1 = new Person();//1:00:00

            Console.WriteLine(DateTime.Now);

            Thread.Sleep(1000 * 10);

            Console.WriteLine(DateTime.Now);

            Console.WriteLine(p1.BirthDay);

        }

 

   

通过在public DateTime BirthDay = DateTime.Now上设定断点来验证。

再难一点

    class Person

    {

        public static int A = 30;

        static Person()//静态构造函数在static字段初始化完成后执行

        {//静态构造函数只执行一次

            A++;

        }

        public int B = A++;//字段的初始化赋值代码只是在new一个对象的时候执行,而不是每次用字段的时候都执行

        public Person()

        {B++;}

    }

程序的执行结果是什么?

            Person p1 = new Person();

            Console.WriteLine(p1.B);

            Console.WriteLine(Person.A);

            Console.WriteLine(p1.B);

            Console.WriteLine(Person.A);

 

            Person p2 = new Person();

            Console.WriteLine(p2.B);

            Console.WriteLine(Person.A);

 

127、说一下SQLServer中索引的两种类型(常考!!!)

参考:聚簇(或者叫做聚集,cluster)索引和非聚簇索引。

字典的拼音目录就是聚簇(cluster)索引,笔画目录就是非聚簇索引。这样查询“G到M的汉字”就非常快,而查询“6划到8划的字”则慢。

聚簇索引是一种特殊索引,它使数据按照索引的排序顺序存放表中。聚簇索引类似于字典,即所有词条在字典中都以字母顺序排列。聚簇索引实际上重组了表中的数据,所以你只能在表中建立一个聚簇索引。


当数据按值的范围查询时,聚簇索引就显得特别有用。因为所有SQLServer都必需先找到所查询范围的第一行,然后依次下去,直到该范围的最后一个值找到为止,并且保证了所有其他值也落在这个范围内。举一个例子,一个应用程序要查找首字母位于G和P之间的姓名列表,SQLServer首先找到以字母G开头的名字,取出所有记录,直到找到以字母P开头的名字为止,这种方法使得查询过程非常高效。

进行大量数据改动的表不适宜用聚簇索引,因为SQLServer将不得不在表中维护行的次序。如果要索引的值极少,例如一个列包含的全都是1和0,创建聚簇索引就不是个好主意。如果表经常由一个指定的列来排序,该列将是簇索引的最佳候选列。这是因为表中的数据已经为你排好序了。如果访问一个表并使用BETWEEN、<、>、>=或<=操作符来返回一个范围的值时,应该考虑使用聚簇索引。

128、沪江网网申题:

1)能否脱离VS用类似editplus的工具手写代码?你觉得如何才能提高代码的效率和性能?

可以,使用CSC.exe 来编译.cs文件!

可以根据业务流程、业务数据的特点进行优化,比如可以采用缓存、索引、表驱动等来提升代码的效率和性能,同时不要进行无意义的代码优化,重点优化系统的性能瓶颈。

 

2).如何提高页面的显示速度?假如一个页面的加载时间是10.89s,你会用什么样的方式进行优化?

回答要大气!显得很牛!

提示:分而治之的思想。

首先要找出问题所在,是服务器端运行的速度慢还是服务器端到客户端的下载慢还是页面在浏览器的加载速度慢。

                如果是服务器端运行速度慢,则找是数据库的原因还是算法的问题,如果是数据库的问题则尝试添加索引、优化SQL语句,如果是算法的问题,则优化算法。如果对于一些不经常改动的页面可以使用静态页技术!对于一些数据不需要及时更新的而且取数据的过程非常耗时可以使用缓存。页面中的内容可以按需加载(比如说可以像verycd网站的评论那样当用户需要看的时候再加载其内容),可以在图片需要显示的时候再进行加载。

                如果是服务器端到客户端的下载慢则看是页面体积过于臃肿还是网络问题,如果是页面体积过于臃肿,则优化HTML代码,去掉无用的标签,压缩JS、CSS,可以用CSS Spirit技术将多个图片放到一个图片中,减少向服务器的请求。如果是网络问题,则尝试在不同的网络、地区部署服务器,然后使用CDN技术加速访问。

                如果是页面中的JavaScript运行复杂导致运行速度慢,则优化JavaScript。

webkaka:测网速。

如何处理百万条数据的优化?

对于经常进行检索的字段创建索引,对于经常进行范围查询的一个字段创建聚集索引;

当有大量数据进行插入的时候进行批量插入;

一些代码用存储过程进行重写(当一个逻辑有多行SQL要执行的时候用存储过程可以优化速度,可以避免客户端和SQLServer之间多次交互);

(*)集群、读写分离;

(*)分区、分表;

 

3).在程序编码的时候,你会对Sql注入漏洞的防范采取什么样的措施?

尽量不要拼SQL语句!使用参数化查询或存储过程可以防止SQL注入攻击!在必须用SQL拼接的地方对用户输入的内容进行检查、过滤。

4).你会采用什么样的策略和方法来实现系统缓存?

在ASP.NET中 缓存有 页面缓存,数据源缓存,和一些自己定义的缓存!

对于那些整个页面不经常变化的我们可以使用页面缓存,而对于那些执行非常耗时的SQL语句并且数据的及时性要求不高的我们可以使用数据源缓存。

对于页面缓存、数据源缓存等都不满足要求的情况下采用直接操作HttpRuntime.Cache来自定义缓存策略。如果需要用多台Web服务器作为一个集群来承载网站的情况,则可以部署专门的分布式缓存服务器,比如Memcached。

 

5)网站想要实现文件防盗链的功能,说说你的解决方案。

读取HTTP报文头中的UrlReferrer在Application_BeginRequest中我们可以判断用户的请求是否来源于本网站。如果不是我们可以终止用户的请求(Response.End();)!

 

6).有这样一个功能需求,用户新注册的时候需要给他推荐3个好友,说说你的推荐算法

比如说类似豆瓣网我们可以根据用户兴趣来匹配,类似于人人网那些地区性比较比较强的网站我们可以根据用户的地区来匹配。

 

7).如果给学英语的用户设计一个在线应用,你会选择什么作为切入点,简述你的想法和理由。

英语学习资料的下载、在线答疑、用户交流、在线英语角作为切入点。

 

8).你眼中的沪江是怎样的?谈谈你对沪江的理解

我眼中的沪江是为那些爱好外语,需要学习外语人提供一个学校交流的平台!

 

9).是否有以下相关开发经验?如有请简要说明开发情况(有可看项目网址也请提供)。

a、lucene相关开发经验

b、分布式文件处理经验

c、流媒体相关开发经验

d、语音技术

e、高负载网站开发

f、手机相关开发

 

 

129、请编程遍历WinForm页面上所有TextBox控件并给它赋值为string.Empty?
答:
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; 
tb.Text = String.Empty ;
}
}

 

132、

            int i=2000;

            object o=i;

            i=2001;

            int j=(int)o;

            Console.WriteLine("i={0},o={1},j={2}",i,o,j);

输出的结果是:

134.一个数组:1,1,2,3,5,8,13,21...+m,求第30位数是多少?用递归实现;(常考!!!)

写递归要确定两个:递归的终止条件;递归表达式。

解答:总结递归规律:F(n)=F(n-2)+F(n-1) Fibonacci数列

        static int F(int n)

        {

            if (n == 1)

            {

                return 1;

            }

            if (n == 2)

            {

                return 1;

            }

            return F(n - 2) + F(n - 1);

        }

非递归(有bug吗?),递归算法的缺点:测试大数据

           int n = Convert.ToInt32(Console.ReadLine());

           if(n<=0)

           {Console.WRiteLine("必须大于0");return;}

           if(n==1)  //时刻注意边界值!!!

           {
                Console.WriteLine("1");

               return;

           }

            int[] data =new int[n];

            data[0] = 1;

            data[1] = 1;

            for(int i=2;i<n;i++)

            {

                data[i] = data[i-1]+data[i-2];

            }

            Console.WriteLine(data[n-1]);

从上面可以看出前两个数相加得到第三个数。

public static int SuanFa (int i)
        {
             if(i>0)
              {
                  if (1 >= i || i <= 2)

                      return 1;

                   if(i>2)

                      return SuanFa(i-1) + SuanFa(i-2);

              }
              else

                 return 0;

        }

SuanFa(i-1)代表算出它的前一个数。

SuanFa(i-2)代表算出它的前第二个数。

public int GetNumberAtPos(int pos)

{
        if(pos==0||pos==1)

       {
             return 1;
       }
        int res = GetNumberAtPos(pos - 1) + GetNumberAtPos(pos - 2);
        return res;
  }

 或

public int show(int i){
        
//         Console.WriteLine(show(30));
        if(i<=0){
         a=0;
        }
        if(i==1&&i<=2){
            a=1;
            
        }
        else{
            a=show(i-1)+show(i-2);
        }
        return a;
        
    }

上面程序的时间复杂度为O(n),空间复杂度为O(n)

 

用BigInteger解决溢出的问题。

“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000001”

是个质数。

直觉告诉我,光是在中间加几个0,在后面加个1,估计不是质数。

有很多面试题,都会要面试者去做一些关于大数的运算,例如在这里就有判断上面这个数是不是质数的情况。

很明显,Integer ,Long都是不能来处理如此巨大的数的。

在.net framework 4.0中,System.Numerics.dll 中提供了BigInteger 类。使用这个类可以很方便的解决这个问题。

判断n是质数的方法:

1:如果是偶数,肯定不是质数

2:如果能够被小于或等于Sqrt(n) 的数除尽,则不是质数。

 

上周一个C#开发的站点出现了内存溢出错误:“引发类型为“System.OutOfMemoryException”的异常”

因为页面众多一时最初难以确定问题源,找了很久才发现了导致内存溢出的代码。把这次的方法总结一下。

症状:每个一段时间才会出现内存溢出的错误,服务器上会出现大量的页面请求被堵塞。回收iis程序池后,会短暂正常,但是过一段时间后又出现内存溢出,时间间隔长短不一,没有规律。

解决步骤:1,判断是某个页面被请求到时引发的内存溢出错误。

              2,寻找有问题的页面

                   存在内存溢出错误代码的页面,当被请求时,应该不会被执行结束。

                   所以,通过OnPreInit方法,在所有页面被请求时,将该页面的地址,请求时间记录到数据库中。每次请求都会在数据库中增加一条记录。

                   在页面执行到OnUnload方法时,再将该页面的总执行时间更新到上面提到的请求记录中。(新增时,总执行时间默认为-1)

                  

通过上述方式,分析几次内存溢出发生时,没有被执行结束的页面。最终确定的问题页面所在,修改代码上传后,内存溢出问题解决。

 

 

 

如果回答斐波那契数列:提到用非递归实现、注意边界条件以及用BigInteger解决溢出问题!

//Main

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Fibonacci
{
    class Program
    {
  static void Main(string[] args)
        {
            Console.WriteLine("Would you like to know which Fibonacci Numbers:");
            int number = Convert.ToInt32(Console.ReadLine());
            //
            Function obj = new Function();
            Console.WriteLine();
            Console.Write("The {0} Fibonacci number is:{1}", number, obj.Fibonacci(number));
            //
            Console.WriteLine();
            Function obj2 = new Function(number);
            Console.Write("The {0} Fibonacci number is:{1}", number, obj2.BottomUpNotRecursion(number));
            //
            Console.WriteLine();
            Console.Write("The {0} Fibonacci number is:{1}", number, obj2.TopDownRecursion(number));
            Console.ReadKey();

        }
    }
}

//class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Fibonacci
{
    class Function
    {
        private int[] array;

        public Function()
        {

        }

        /// <summary>
        /// Function
        /// </summary>
        /// <param name="length"></param>
        public Function(int length)
        {
            if (length > 0)
            {
                array = new int[length + 1];
                array[0] = 1;
                array[1] = 1;
            }
            if (length == 0)
            {
                array = new int[1];
                array[0] = 1;
            }
        }

        /// <summary>
        /// Fibonacci数列定义为:
        ///             无穷数列1,1,2,3,5,8,13,21,34,55,……
        ///        ┌ 1             n=0     
        ///   F(n)=│ 1             n=1
        ///        └ F(n-1)+F(n-2) n>1
        /// </summary>
        /// <param name="number">第几个斐波那契数</param>
        /// <returns></returns>
        public int Fibonacci(int number)
        {
            if (number <= 1)
            {
                return 1;
            }
            else
            {
                return Fibonacci(number - 1) + Fibonacci(number - 2);
            }
        }

        /// <summary>
        /// 动态规划思想:
        ///     1.自底向上非递归算法
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public int BottomUpNotRecursion(int number)
        {
            int copynumber = 0;
            if (number < 2)
            {
                copynumber = 1;
            }
            else
            {
                int one = array[0];
                int two = array[1];

                for (int i = 2; i < array.Length; i++)
                {
                    array[i] = one + two;
                    one = two;
                    two = array[i];
                    copynumber = array[i];
                }
            }

            return copynumber;
        }

        /// <summary>
        ///     2.自顶向下递归算法
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public int TopDownRecursion(int number)
        {
            if (number <= 2)
            {
                if (number == 0)
                    return array[0];
                if (number == 1)
                    return array[1];
                if (number == 2)
                    return array[2] = array[0] + array[1];
            }
            else
            {
                //递归只是一个“牵引线”,目的是为了让数组储存值。
                TopDownRecursion(number - 1);
                array[number] = array[number - 1] + array[number - 2];
            }
            return array[number];
        }
    }
}

 

 

题目:计算两个非常大的整数的加法、乘法。用程序实现乘法、加法运算。最起码把思路说出来,说自己写不出来,但是工作中用BigInteger解决。

 

参考:

算法复杂度:时间复杂度:算法运行需要消耗的时间的数量级、空间复杂度:算法运行需要消耗的内存的数量级。

消耗的时间或者内存随着问题规模的扩大而成正比增加,就是O(n)。

消耗的时间或者内存随着问题规模的扩大而不变,就是O(1)。

消耗的时间或者内存随着问题规模的扩大而n*n增加,就是O(n*n)

 

算法复杂度只考虑最差情况(从一个数组中找出第一个大于10的数,时间复杂度为O(n)),并且算法复杂度忽略常量和低阶。把数组数一遍和数两遍的时间复杂度都是O(n)。把长度为n的数组数n/2遍的时间复杂度还是O(n*n)。

上课时把数组前后颠倒的算法的时间复杂度为O(n),空间复杂度为O(1)。

136.ref与out的区别?

ef和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

out

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

属性不是变量,不能作为 out 参数传递。 

ref是    有进有出,而out是       只出不进。

 

137.表A字段Id为numberic(18,0),哪个SQL语句是错误的:

select * from A where id='';

select * from A where id='13';

select * from A where id=null;

select * from A where id=' 13';

select * from A where id='';  报错,因为''为空字符串。
select * from A where id='13';不报错,因为系统默认把字符串13转为数字13
select * from A where id=null;不报表,null值什么类型都能代替。
select * from A where id=' 13';报表,' 13'有空格,为字符串。

 

 

138.在SQLServer中求当前时间与2012-01-01 0:0:0相差的秒数?

select abs(datediff(ss,getdate(), '2012-01-01 00:00:00'))

 

140、做一个表格,三行三列,第一列,前两行合一;第二行,后两列合一。

<table width="100%" border="0" cellspacing="1" cellpadding="1">
      <tr>
        <td width="33%"> </td>
        <td width="34%"> </td>
        <td width="33%"> </td>
      </tr>
      <tr>
        <td> </td>
        <td align="center" valign="middle">我在中间</td>
        <td> </td>
      </tr>
      <tr>
        <td> </td>
        <td> </td>
        <td> </td>
      </tr>
    </table>
就这个?

 

141、下面的HTML代码

<style type="text/css">

        #Text1{ background-color:Red}

        .txt{ background-color:Green}

        input {background-color:Black}

    </style>

<input id="Text1" type="text" class="txt" />

<input type="text" class="txt" />

两个文本框各是什么颜色?

参考资料:个人大于集体:元素单独设置的样式>class命名样式>标签样式。样式override父级别的。

 

 

145、传智播客.net培训精品就业班学员总结SQL题

表一:student_info

学号

姓名

性别

出生年月

家庭住址

备注

0001

张三

1981-8-9

北京

NULL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

表二:curriculum

课程编号

课程名称

学分

0001

计算机基础

2

0002

C语言

2

 

表三:grade

学号

课程编号

分数

0001

0001

80

0001

0002

90

 

题目:

条件查询:

  1. 在GRADE表中查找80-90份的学生学号和分数

select 学号,分数 from grade where 分数 between 80 and 90

  1. 在GRADE 表中查找课程编号为003学生的平均分

   select avg(分数) from grade where 课程编号='003'

  1. 在GRADE 表中查询学习各门课程的人数

Select课程编号,count(学号) as 人数from grade group by 课程编号

  1. 查询所有姓张的学生的学号和姓名

   select  姓名,学号 from student_info where 姓名 like '张%'

 

嵌套查询:

1、 查询和学号’0001’的这位同学性别相同的所有同学的姓名和出生年月

 select 姓名,出生年月 from student_info where 性别 in(select 性别 from student_info where sno='0001')

2、 查询所有选修课程编号为0002 和0003的学生的学号、姓名和性别

select 学号,姓名,性别 from student_info where 学号 in(select 学号 from grade where 课程编号='0002' and 学号 in(select 学号 from grade where 课程编号='0001'))

3、 查询出学号为0001的学生的分数比0002号学生最低分高的课程编号的课程编号和分数

select 课程编号, 分数 from grade where 学号='0001' and 分数>(select min(分数) from grade where 学号='0002')

多表查询:

1、 查询分数在80-90分的学生的学号、姓名、分数

select student_info.学号,student_info.姓名,grade.分数 from student_info,grade where grade.分数 between 80 and 90

2、 查询学习了’C语言’课程的学生学号、姓名和分数

select student_info.学号,student_info.姓名,grade.成绩from student_info,grade,curriculum where student_info.学号=grade.学号and grade.课程号=curriculum.课程号and curriculum.课程名='C语言'

3、 查询所有学生的总成绩,要求列出学号、姓名、总成绩,没有选课的学生总成绩为空。

 

select grade.学号,student_info.姓名,sum(grade.成绩) as 总成绩from student_info,grade where grade.学号=student_info.学号group by grade.学号,student_info.姓名

 

题目、活期存款中,“储户”通过“存取款单”和“储蓄所”发生联系。假定储户包括:账号,姓名,电话,地址,存款额;“储蓄所”包括:储蓄所编号,名称,电话,地址(假定一个储户可以在不同得储蓄所存取款)
1、写出设计以上表格的语句(4分)
2、创建一个触发器TR1完成下面内容:
当向“存取款单”表中插入数据时,如果存取标志=1则应该更改储户表让存款额加上存取金额,如果存取标志=0则应该更改储户表让存款额减去存取金额,如果余额不足显示余额不足错误。

 

CREATE TABLE CREATE TRIGGER tr1 on qukuan after insert

AS

BEGIN

   

declare @sid nvarchar(50)

declare @type int

declare @qian int

declare @yuer int

select @sid=sid,@type=[type],@m=m from inserted

select @yuer=yuer from cunkuan

if(@type=1)

begin

update cunkuan set yuer=yuer+@qian

end

else

begin

 if(@yuer<@qian)

   begin

     print '余额不足'

   end

 else

    begin

     update cunkuan set yuer=yuer-@qian

    end

end

 

 

END

GO

 

本题用到下面三个关系表:

CARD     借书卡:   (CNO 卡号,NAME  姓名,CLASS 班级)

BOOKS    图书:     (BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数 )

BORROW   借书记录: (CNO 借书卡号,BNO 书号,RDATE 还书日期

备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

要求实现如下处理:

  1. 写出自定义函数,要求输入借书卡号能得到该卡号所借书金额的总和

 

CREATE FUNCTION getSUM

(

@CNO int

)

RETURNS int

AS

BEGIN

    declare @sum int

select @sum=sum(price) from BOOKS where bno in (select bno from BORROW where cno=@CNO)

 

return @sum

END

GO

 

  2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。

select CNO,count(BNO) as 借书数量from BORROW group by CNO having count(BNO)>3

 

  3. 查询借阅了"水浒"一书的读者,输出姓名及班级。

 

select name,class from card where cno in( select cno from borrow where bno in(

select bno from BOOKS where bname='水浒'))

 

  4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。

 

select CNO,BNO,RDATE from borrow where getdate()>RDATE

 

  5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者。

select bno,bname,author from books where bname like '网络%'

  6. 查询现有图书中价格最高的图书,输出书名及作者。

select bname,author from books where price in(select max(price) from books  )

  7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。

select cno from borrow where bno in (select bno from books where bname='计算方法') and cno not in ( select cno from borrow where bno in(select bno from books where bname='计算方法习题集')) order by cno desc

 

 

SELECT a.CNO

FROM BORROW a,BOOKS b

WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法'

    AND NOT EXISTS(

        SELECT * FROM BORROW aa,BOOKS bb

        WHERE aa.BNO=bb.BNO

            AND bb.BNAME=N'计算方法习题集'

            AND aa.CNO=a.CNO)

ORDER BY a.CNO DESC

 

  8. 将"C01"班同学所借图书的还期都延长一周。

 

update borrow set rdate=dateadd(day,7,rdate) from BORROW where cno in(select cno from card where class='一班')

 

 

  9. 从BOOKS表中删除当前无人借阅的图书记录。

DELETE A FROM BOOKS a

WHERE NOT EXISTS(

    SELECT * FROM BORROW

    WHERE BNO=a.BNO)

 

 

  10.如果经常按书名查询图书信息,请建立合适的索引。

(这个不确定对不 90%应该是对的 自己看了下书写的)

CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)

 

  11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。

 

CREATE TRIGGER TR_SAVE ON BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

INSERT BORROW_SAVE SELECT i.*

FROM INSERTED i,BOOKS b

WHERE i.BNO=b.BNO

    AND b.BNAME=N'数据库技术及应用'

  12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。

 

CREATE VIEW V_VIEW

AS

select name,bname

from  books,card,borrow

where borrow.cno=card.cno and borrow.bno=books.bno and class='一班'

 

  13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。

 

select a.cno from borrow a,borrow b

where a.cno=b.cno and

 a.bno in(select bno from books where bname='计算方法') and

b.bno in(select bno from books where bname='组合数学')

order by a.cno desc

 

 

SELECT a.CNO

FROM BORROW a,BOOKS b

WHERE a.BNO=b.BNO

  AND b.BNAME IN('计算方法','组合数学')

GROUP BY a.CNO

HAVING COUNT(*)=2

ORDER BY a.CNO DESC

 

  14、用事务实现如下功能:一个借书卡号借走某书号的书,则该书的库存量减少1,当某书的库存量不够1本的时候,该卡号不能借该书

 

alter PROCEDURE pro_jieshu

 @cno int,

 @bno int,

 @date datetime

AS

BEGIN

 

begin tran

 

declare @quantity int

 

select @quantity=quantity from books where bno=@bno

  insert into borrow values(@cno,@bno,@date)

     update books set quantity=@quantity-1 where bno=@bno

if(@quantity>0)

  begin

   commit tran

  end

else

  begin

   print '已无库存'

   rollback

  end

END

GO

 

  15、用游标实现将书号为‘A001’的书本的价格提高10元

 

declare @bno int

declare @bname nvarchar(50)

declare @author nvarchar(50)

declare @price int

declare @quantity int

 

declare mycursor cursor for select * from books

 

open mycursor

 

fetch next from mycursor into @bno,@bname,@author,@price,@quantity

 

while(@@fetch_status=0)

  begin

      if(@bno=2)

       begin

     update books set price=@price+10 where current of mycursor

       end

     fetch next from mycursor into @bno,@bname,@author,@price,@quantity

  end

 

close mycursor

 

deallocate mycursor

 

 

 

 

Student(S#,Sname,Sage,Ssex) 学生表

Course(C#,Cname,T#) 课程表

SC(S#,C#,score) 成绩表

Teacher(T#,Tname) 教师表

 

问题:

1、查询“001”课程比“002”课程成绩高的所有学生的学号;

  select a.S# from (select s#,score from SC where C#='001') a,(select s#,score

  from SC where C#='002') b

  where a.score>b.score and a.s#=b.s#;

2、查询平均成绩大于60分的同学的学号和平均成绩;

    select S#,avg(score)

    from sc

    group by S# having avg(score) >60;

3、查询所有同学的学号、姓名、选课数、总成绩;

  select Student.S#,Student.Sname,count(SC.C#),sum(score)

  from Student left Outer join SC on Student.S#=SC.S#

  group by Student.S#,Sname

4、查询姓“李”的老师的个数;

  select count(distinct(Tname))

  from Teacher

  where Tname like '李%';

5、查询没学过“叶平”老师课的同学的学号、姓名;

    select Student.S#,Student.Sname

    from Student 

    where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');

6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

  select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');

7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

  select S#,Sname

  from Student

  where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='叶平'));

8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

  Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2

  from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;

9、查询所有课程成绩小于60分的同学的学号、姓名;

  select S#,Sname

  from Student

  where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

10、查询没有学全所有课的同学的学号、姓名;

    select Student.S#,Student.Sname

    from Student,SC

    where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);

11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;

    select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';

12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;

    select distinct SC.S#,Sname

    from Student,SC

    where Student.S#=SC.S# and C# in (select C# from SC where S#='001');

13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;

    update SC set score=(select avg(SC_2.score)

    from SC SC_2

    where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');

14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;

    select S# from SC where C# in (select C# from SC where S#='1002')

    group by S# having count(*)=(select count(*) from SC where S#='1002');

15、删除学习“叶平”老师课的SC表记录;

    Delect SC

    from course ,Teacher 

    where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';

16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2

    号课的平均成绩;

    Insert SC select S#,'002',(Select avg(score)

    from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');

17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分

    SELECT S# as 学生ID

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语

        ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩

    FROM SC AS t

    GROUP BY S#

    ORDER BY avg(t.score) 

18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

    SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分

    FROM SC L ,SC AS R

    WHERE L.C# = R.C# and

        L.score = (SELECT MAX(IL.score)

                      FROM SC AS IL,Student AS IM

                      WHERE L.C# = IL.C# and IM.S#=IL.S#

                      GROUP BY IL.C#)

        AND

        R.Score = (SELECT MIN(IR.score)

                      FROM SC AS IR

                      WHERE R.C# = IR.C#

                  GROUP BY IR.C#

                    );

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序

    SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩

        ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数

    FROM SC T,Course

    where t.C#=course.C#

    GROUP BY t.C#

    ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC

20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004

    SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分

        ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数

        ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分

        ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数

        ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分

        ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数

        ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分

        ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数

  FROM SC

 

 

 

 

21、查询不同老师所教不同课程平均分从高到低显示

  SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩

    FROM SC AS T,Course AS C ,Teacher AS Z

    where T.C#=C.C# and C.T#=Z.T#

  GROUP BY C.C#

  ORDER BY AVG(Score) DESC

22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004

    [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩

    SELECT  DISTINCT top 3

      SC.S# As 学生学号,

        Student.Sname AS 学生姓名 ,

      T1.score AS 企业管理,

      T2.score AS 马克思,

      T3.score AS UML,

      T4.score AS 数据库,

      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分

      FROM Student,SC  LEFT JOIN SC AS T1

                      ON SC.S# = T1.S# AND T1.C# = '001'

            LEFT JOIN SC AS T2

                      ON SC.S# = T2.S# AND T2.C# = '002'

            LEFT JOIN SC AS T3

                      ON SC.S# = T3.S# AND T3.C# = '003'

            LEFT JOIN SC AS T4

                      ON SC.S# = T4.S# AND T4.C# = '004'

      WHERE student.S#=SC.S# and

      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)

      NOT IN

      (SELECT

            DISTINCT

            TOP 15 WITH TIES

            ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)

      FROM sc

            LEFT JOIN sc AS T1

                      ON sc.S# = T1.S# AND T1.C# = 'k1'

            LEFT JOIN sc AS T2

                      ON sc.S# = T2.S# AND T2.C# = 'k2'

            LEFT JOIN sc AS T3

                      ON sc.S# = T3.S# AND T3.C# = 'k3'

            LEFT JOIN sc AS T4

                      ON sc.S# = T4.S# AND T4.C# = 'k4'

      ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);

 

23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]

    SELECT SC.C# as 课程ID, Cname as 课程名称

        ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]

        ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]

        ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]

        ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]

    FROM SC,Course

    where SC.C#=Course.C#

    GROUP BY SC.C#,Cname;

 

24、查询学生平均成绩及其名次

      SELECT 1+(SELECT COUNT( distinct 平均成绩)

              FROM (SELECT S#,AVG(score) AS 平均成绩

                      FROM SC

                  GROUP BY S#

                  ) AS T1

            WHERE 平均成绩 > T2.平均成绩) as 名次,

      S# as 学生学号,平均成绩

    FROM (SELECT S#,AVG(score) 平均成绩

            FROM SC

        GROUP BY S#

        ) AS T2

    ORDER BY 平均成绩 desc;

 

25、查询各科成绩前三名的记录:(不考虑成绩并列情况)

      SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数

      FROM SC t1

      WHERE score IN (SELECT TOP 3 score

              FROM SC

              WHERE t1.C#= C#

            ORDER BY score DESC

              )

      ORDER BY t1.C#;

26、查询每门课程被选修的学生数

  select c#,count(S#) from sc group by C#;

27、查询出只选修了一门课程的全部学生的学号和姓名

  select SC.S#,Student.Sname,count(C#) AS 选课数

  from SC ,Student

  where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;

28、查询男生、女生人数

    Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男';

    Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女';

29、查询姓“张”的学生名单

    SELECT Sname FROM Student WHERE Sname like '张%';

30、查询同名同性学生名单,并统计同名人数

  select Sname,count(*) from Student group by Sname having  count(*)>1;;

31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)

    select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age

    from student

    where  CONVERT(char(11),DATEPART(year,Sage))='1981';

32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

    Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;

33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩

    select Sname,SC.S# ,avg(score)

    from Student,SC

    where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85;

34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数

    Select Sname,isnull(score,0)

    from Student,SC,Course

    where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='数据库'and score <60;

35、查询所有学生的选课情况;

    SELECT SC.S#,SC.C#,Sname,Cname

    FROM SC,Student,Course

    where SC.S#=Student.S# and SC.C#=Course.C# ;

36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;

    SELECT  distinct student.S#,student.Sname,SC.C#,SC.score

    FROM student,Sc

    WHERE SC.score>=70 AND SC.S#=student.S#;

37、查询不及格的课程,并按课程号从大到小排列

    select c# from sc where scor e <60 order by C# ;

38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;

    select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';

39、求选了课程的学生人数

    select count(*) from sc;

40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩

    select Student.Sname,score

    from Student,SC,Course C,Teacher

    where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );

41、查询各个课程及相应的选修人数

    select count(*) from sc group by C#;

42、查询不同课程成绩相同的学生的学号、课程号、学生成绩

  select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ;

43、查询每门功成绩最好的前两名

    SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数

      FROM SC t1

      WHERE score IN (SELECT TOP 2 score

              FROM SC

              WHERE t1.C#= C#

            ORDER BY score DESC

              )

      ORDER BY t1.C#;

44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列 

    select  C# as 课程号,count(*) as 人数

    from  sc 

    group  by  C#

    order  by  count(*) desc,c# 

45、检索至少选修两门课程的学生学号

    select  S# 

    from  sc 

    group  by  s#

    having  count(*)  >  =  2

46、查询全部学生都选修的课程的课程号和课程名

    select  C#,Cname 

    from  Course 

    where  C#  in  (select  c#  from  sc group  by  c#) 

47、查询没学过“叶平”老师讲授的任一门课程的学生姓名

    select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平');

48、查询两门以上不及格课程的同学的学号及其平均成绩

    select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;

49、检索“004”课程分数小于60,按分数降序排列的同学学号

    select S# from SC where C#='004'and score <60 order by score desc;

50、删除“002”同学的“001”课程的成绩

delete from Sc where S#='001'and C#='001';

 

一定要复习如何通过CreateTable、Alter Table来创建、修改表结构!

 

14. 假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句

--实现代码:

ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)

 

15.1 将NAME最大列宽增加到10个字符(假定原为6个字符)

--实现代码:

ALTER TABLE CARD ALTER COLUMN NAME varchar(10)

 

15.2 为该表增加1列NAME(系名),可变长,最大20个字符

--实现代码:

ALTER TABLE CARD ADD 系名 varchar(20)

 

 

锁的问题:

       public void Test(int i)

        {

            lock (this)

            {

                if (i > 10)

                {

                    i--;

                    Test(i);

                }

            }

        }

     执行Test(10)是否会造成死锁?

答:不会,因为多线程才有锁的问题,线程无法自己锁自己(单线程必然是有先后执行顺序的,没必要锁)

问学网2011

3、Math.Round(11.5)、Math.Round(11.3)、Math.Round(-11.5)、Math.Round(-11.3)的值各是多少?

答案:Round 四舍五入:Math.Round(-11.5)=-12,因为是按照绝对值考虑。

扩展:Math.Ceiling(-11.6)=-11,因为负数的天花板也在上面。

Math.Floor(-11.5)=-12

4、short s=1;s=s+1;有错吗?short s=1;s+=1;有错吗?

答案:第一个有错,因为1是int类型,int+short结果是int,无法隐式转换,改为s = (short)(s + 1);就可以了。

第二个没错,经过反编译发现编译器自动优化成s = (short)(s + 1);

 

5、产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。(要求使用两种方法)

 

解答:Random类是一个伪随机数算法,原理:

r(n)=(sed+r(n-1))%100;

    class MyRand

    {

        private int seed;

        private int prevNumber = 10;

        public MyRand(int seed)

        {

            this.seed = seed;

        }

 

        public int Next()

        {

            int newRand = (seed + prevNumber) % 100;

            prevNumber = newRand;

            return newRand;

        }

    }

生成的随机数是依赖于上一个的,所以叫“随机数序列”。,确定的种子产生确定的随机数序列。

为了避免每次生成的随机数序列都一样,所以一般采用当前系统运行的毫秒数Environment.TickCount做种子。

这就明白为什么

            //for (int i = 0; i < 10; i++)

            //{

            //    Random rand = new Random();

            //    Console.WriteLine(rand.Next(100));

            //}

是错的。

经过反编译,Random类的无参构造函数最终也是调用有参的,传递的就是当前毫秒数

public Random() : this(Environment.TickCount)

这就验证了

            //for (int i = 0; i < 10; i++)

            //{

            //    Random rand = new Random();

            //    Console.WriteLine(rand.Next(100));

            //}

为什么一样,或者一半一样,是因为在同一毫秒内。

 

做法1:

            List<int> list = new List<int>();

            Random rand = new Random();

            while (list.Count < 100)

            {

                int number = rand.Next(1, 101);//>=1,<101

                if (!list.Contains(number))//如果list中已经含有这个数,则不插入

                {

                    list.Add(number);

                }

            }

 

            foreach (int i in list)

            {

                Console.WriteLine(i);

            }

 

做法2:

先把1-100这100个数按顺序放入数组arr,再重复100次下面的操作,生成两个介于 >=0,<100 之间的随机数m、n,颠倒arr[m]和arr[n]的数。

 

            int[] arr = new int[100];

            //把100个数顺序放入

            for (int i = 0; i < 100; i++)

            {

                arr[i] = i + 1;

            }

 

            Random rand = new Random();

            for (int i = 0; i < 100; i++)

            {

                //随机生成两个位置

                int m = rand.Next(0, 100);

                int n = rand.Next(0, 100);

 

                //颠倒两个位置

                int temp = arr[m];

                arr[m] = arr[n];

                arr[n] = temp;

            }

 

2、JavaScript中声明空数组。

[]

 

晨飞燕第一次

2、冒泡排序(背也要背下来,50%必考!)

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

            {

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

                {

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

                    {

                        int temp = nums[i];

                        nums[i] = nums[i + 1];

                        nums[i + 1] = temp;

                    }

                }

            }

如果只是调用集合的Sort方法,是不满足人家要求的!一定要自己写!

快速排序(!)

 

5、select * from t where id=(select max(id) from t)

更简单的就是:select top 1 * from t order by id desc

 

6、题有问题,应该增加一个主键字段

 

create table T_Persons(id bigint identity(1,1),name nvarchar(20),age int)

 

insert into T_Persons(name,age) values('小明',20);

insert into T_Persons(name,age) values('小明',20);

insert into T_Persons(name,age) values('小黑',20);

insert into T_Persons(name,age) values('小明',20);

insert into T_Persons(name,age) values('小宏',20);

 

--取出name、age相同的id最小的数据

select min(id)

from T_Persons

group by name,age;--按照name和age分组

 

--把id等于最小值的取出来

select * from T_Persons where id in

(

select min(id)

from T_Persons

group by name,age--按照name和age分组

)

 

答案:

--把不等于最小id的删掉

delete from T_Persons where id not in

(

select min(id)

from T_Persons

group by name,age--按照name和age分组

)

 

9、别瞎回答,要重点突出自己的和别人不一样的地方。别犯以前同学最后一关说自己父母管自己很严的事情。

 

你为什么来我们公司?如果是知名公司,就说仰慕贵公司,(举例,看到你们网站发展速度快,还听说过关于你们技术团队、技术架构的介绍);如果是不知名公司,就说喜欢这个行业。描述自己针对这个职位的优势

 

 

4、2+5+"8"得到的结果是什么?

解答:从左向右运算,int+string是string。所以是"78"

"8"+2+5是"825",而"8"+(2+5)是“87”

5、

(1)

var x=1;

var y=0;

var z=0;

function add(n){n=n+1;return n;}

y=add(x);

function add(n){n=n+3;return n;}

z=add(x);

求y和z的值是多少?

 

参考:JavaScript引擎会先解析所有的命名函数,再去从上向下执行js代码。所以第二个add覆盖了第一个add的定义。因此结果是4、4

 

(2)传智播客增加一问

 

var x=1;

var y=0;

var z=0;

var add = function(n){n=n+1;return n;}

y=add(x);

add =function(n){n=n+3;return n;}

z=add(x);

求y和z的值是多少?

 

参考:var add = function(n){n=n+1;return n;}是把一个变量名add指向匿名函数。执行的时候add指向哪个函数,就执行哪个函数。从上向下执行。结果是2、4。所以写程序的时候最好用匿名函数。

 

命名函数的add就是函数的名字。而var add = function(n){n=n+1;return n;}则是创建一个匿名函数,并且把变量add指向它,这个函数还是匿名函数,并不会因为有一个变量指向它他就不是匿名函数了。

 

有的公司题量非常大,根本做不完,其实是在考察你哪方面最熟悉,那么挑最会做的先做。

 

 

 

 

 

 

 

C#和asp.net方面的面试题

2014-07-17 06:30:01 阅读( 204 )

2967人 收藏本页

标签:C#面试题

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。
答: private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 程序集内可见。

2. 列举ASP.NET 页面之间传递值的几种方式。
答: 1).使用 QueryString, 如....?id=1; response. Redirect()....
2).使用Session变量
3).使用Server.Transfer
4).Application
5).
6).数据库
7).ViewStat
8).cookie

3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答: public class MainClass
{
public static void Main() 
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}

4. C#中的委托是什么?事件是不是一种委托?
答:委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
是,是一种特殊的委托

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

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

7. 请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答: foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}

8. 请编程实现一个冒泡排序算法?
答: void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
int i,j;
Boolean exchange; //交换标志
for(i=1;i

exchange=FALSE; //本趟排序开始前,交换标志应为假
for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
if(R[j+1].key
{
R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //发生了交换,故将交换标志置为真
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
} //endfor(外循环)
} //BubbleSort

9. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答: C#中的索引器通常用于索引数组。
索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了
索引器和返回值无关
不是。可以用任意类型。

10. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
int Num = Convert.ToInt32(this.TextBox1.Text) ;
int Sum = 0 ;
for (int i = 0 ; i < Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum = Sum - I ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;

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

12. 在下面的例子里
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?答:X=1,Y=0

13. 什么叫应用程序域?
答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

14. CTS、CLS、CLR分别作何解释?
答:1、CTS Common Type System的缩写,中文意思是通用类型系统,是定义公共语言运行库在声明、使用和管理类型时所遵 循的规则的模型。通用类型系统建立一个框架,该框架使得跨语言集成、类型安全和高性能代码执行成为可能。它是您可以用来生成类库的原始资料。
2、CLS Common Language Specification的缩写,中文意思是公共语言规范,定义一组可以以编程方式验证的规则,这组规范控制用不同编程语言编写的类型的交互操作。制定 CLS 是一种确保跨语言交互操作的绝佳方式。托管类库设计人员可以使用 CLS 来保证可从多种编程语言调用他们的 API。请注意,尽管 CLS 鼓励好的类库设计,但是它并不会强制这样的设计。
3、CLR Common Language Runtime的缩写,中文意思是公共语言运行时。

15. 什么是装箱和拆箱?
答:装箱:用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。
拆箱:从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。

16. 什么是受管制的代码?
答:unsafe:非托管代码。不经过CLR运行。

17. 什么是强类型系统?
答: RTTI:类型识别系统。

18. .net中读写数据库需要用到那些类?他们的作用?
答: Connection 数据库连接对象
DataSet:数据存储器。
DataCommand:执行语句命令。
DataAdapter:数据的集合,用语填充。

19. ASP.net的身份验证方式有哪些?分别是什么原理?
答:asp.net提供了3种认证方式: windows身份验证, Forms验证和Passport验证.
windows身份验证: IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问.
Forms验证:用Cookie来保存用户凭证,并将未经身份验证的用户重定向到自定义的登录页.
Passport验证:通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录和核心配置文件服务.

20. 什么是Code-Behind技术?
答: ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.

21. 在.net中,配件的意思是?
答:程序集。(中间语言,源数据,资源,装配清单)

22. 常用的调用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。2.使用VS.NET中的Add Web Reference菜单选项

23. .net Remoting 的工作原理是什么?
答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。

24. 在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。

25. 请详述在dotnet中类(class)与结构(struct)的异同?
答:Class可以被实例化,属于引用类型,是分配在内存的堆上的。Struct属于值类型,是分配在内存的栈上的.

26. 根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
答:if( OnNew != null ) 
OnNew( this, e );

27. 分析以下代码,完成填空
string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
以上代码执行完后,i= j=
答:i=13,j=10

28. SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

29. 根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

30. 简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
答: WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

31. 公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。

32. 给定以下XML文件,完成算法流程图。

< DriverC >









请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。
答:
void FindFile( Directory d )
{
FileOrFolders = d.GetFileOrFolders();
foreach( FileOrFolder fof in FileOrFolders ) 
{
if( fof is File ) 
You Found a file;
else if ( fof is Directory ) 
FindFile( fof );
}
}

33. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
答: 解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

34. 面向对象的语言具有________性、_________性、________性
答:封装、继承、多态。

35. 能用foreach遍历访问的对象需要实现 ___________接口或声明____________方法的类型。
答:IEnumerable 、 GetEnumerator。

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

37. String s = new String("xyz");创建了几个String Object?
答:两个对象,一个是"xyz",一个是指向"xyz"的引用对象s。

38. abstract class和interface有什么区别?
答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

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

40.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

41. 构造器Constructor是否可被override?
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

42. 是否可以继承String类?
答:String类是final类,故不可以继承。

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

44. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,有相同的hash code。

45. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

46. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
答:不能,一个对象的一个synchronized方法只能由一个线程访问。

47. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:都不能。

48. List, Set, Map是否继承自Collection接口?
答:List,Set是;Map不是

49.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

50. 数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有有length()这个方法。

51. sleep() 和 wait() 有什么区别?
答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

52. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答:short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

53. 谈谈final, finally, finalize的区别。
答:final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

54. 如何处理几十万条并发数据?
答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.

55. Session有什么重大BUG,微软提出了什么方法加以解决?
答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。

56. 进程和线程的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。

57. 堆和栈的区别?
答:栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

58. 成员变量和成员函数前加static的作用?
答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

59. ASP.NET与ASP相比,主要有哪些进步?
答:asp解释型,aspx编译型,性能提高,有利于保护源码。

60. 产生一个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++)
intArr[i]=(int)myList[i];

61. 请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
答: session(viewstate) 简单,但易丢失
application 全局
cookie 简单,但可能不支持,可能被伪造
input ttype="hidden" 简单,可能被伪造
url参数简单,显示于地址栏,长度有限
数据库稳定,安全,但性能相对弱

62. C#中接口和类的异同
答:接口和类都是类,不同的是,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用。

63. DataReader和DataSet的异同
答:DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..
DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作...

64. 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
答:Using 引入一个命名空间,或在使用了一个对像后自动调用其IDespose,
New 实例化一个对像,或修饰一个方法,表此方法完全重写此方法

65. 下面的例子中
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?答:x=1,y=2

66. 在.net(C# or vb.net)中如何获得当前窗体或控件的句柄,特别是控件本身的句柄(请列举)。
答:this(C#) Me(vb.net).

67. 在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
答:一个是退出整个应用程序,一个是关闭其中一个form

68. 下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
答:Not Equal——进行了装箱操作。

69. HashMap和Hashtable的区别。
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.

70. 你觉得ASP.NET 2.0(VS2005)和你以前使用的开发工具(.Net 1.0或其他)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern / architecture)可以移植到ASP.NET 2.0上 (或者已经内嵌在ASP.NET 2.0中)
答:1 ASP.NET 2.0 把一些代码进行了封装打包,所以相比1.0相同功能减少了很多代码.
2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮助只有在分离的代码文件,无 法 在页面嵌入服务器端代码获得帮助提示,
3 代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢
4 在绑定数据,做表的分页.Update,Delete,等操作都可以可视化操作,方便了初学者
5 在ASP.NET中增加了40多个新的控件,减少了工作量

71. 重载与覆盖的区别?
答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的

72. 什么是虚函数?什么是抽象函数?
答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。

73. 什么是XML?
答:XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。

74. 什么是Web Service?UDDI?
答:Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。
  UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

75. 委托声明的关键字是______?答:delegate.

76. 用sealed修饰的类有什么特点?答:密封,不能继承。

77. 在Asp.net中所有的自定义用户控件都必须继承自_Control___?

78. 在.Net中所有可序列化的类都被标记为_[serializable]__?

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

80. .某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:
(1) 密码单词的最小长度是两个字母,可以相同,也可以不同
(2) K不可能是单词的第一个字母
(3) 如果L出现,则出现次数不止一次
(4) M不能使最后一个也不能是倒数第二个字母
(5) K出现,则N就一定出现
(6) O如果是最后一个字母,则L一定出现
问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?
A) K B)L C) M D) N
答案:B
问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少?
A)1个 B)3个 C)6个 D)9个
答案:A
问题三:下列哪一个是单词密码?
A) KLLN B) LOML C) MLLO D)NMKO
答案:C

81. ADO.NET相对于ADO等主要有什么改进?
答:1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,
2:不使用com
3:不在支持动态游标和服务器端游
4:可以断开connection而保留当前数据集可用
5:强类型转换
6:xml支持

82. 大概描述一下ASP.NET服务器控件的生命周期
初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载


83、C#有固定的开发工具吗
没有。小到NotePad,大到VS.NET、c#Builder,都可以做C#开发。

84、C#和C++有什么区别?
区别很多。首先是托管与非托管的区别。托管代码不允许进行对内存的操作,而是由固定的垃圾回收机制来完成,而C++则不然。其次C#和JAVA类似,都是运行在虚拟机上的,而C++不需要这样一个平台。最后C#是完全面向对象的。在C#里,万物皆是类,绝对不存在一个超越类以上的函数或变量。C++也是面向对象的,但其仍然保留面向过程语言的特点(比如说C++存在全局变量)。最后,C#摒弃了C++中的多重继承等不易掌握的特点,代之以接口等,使编程变得更加轻松和简便。

85、C#在哪些方面有优势?
C#兼具VB的快速简练、DELphi的可视化控件编程、JAVA的完全面向对象和C++的语法规则。C#最长于WEB开发。

86.什么是COM?
COM(组件对象模型)是软件组件相互通信额度一种方式。它是一种二进制的网络标准,允许任意两个组件通信,平台独立,语言独立,位置透明。COM对象被很好的封装,无法访问内部的实现细节,通过接口来访问COM内部的方法。
优点:软件重用,降低成本和工作量,提高软件的复用率。
COM对象必须实现Iunknown接口,这个接口是管理COM对象生命周期的。当COM对象不使用的时候,接口定义的对象负责释放内存。
QI(查询接口):从一个接口使用的方法转到另一个接口可以使用的方法的过程称为QI,由Idispatch接口管理。
GUIDs每个组件都有一个独一无二的标识,广泛唯一标识。这个标识符就是组件的身份,是一个128位的数字,有系统自动分配。
COM组件必须被注册后才能被使用。

87.COM的缺陷?
如果两个程序都是使用一个COM对象,而这个COM组件升级了的话,很可能出现无法使用新组件的情况,被称为DLL Hell。

88、.NET是如何预防DLL陷阱的
.NET允许配置版本详细的名称和记录需要在执行时用到的版本号。

1.面向对象的思想主要包括什么?
继承 多态 封装
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类的所有数据和操作。
多态:一个程序中同名的不同方法共存的情况。有两种形式的多态– 重载与重写

2.什么是ASP.net中的用户控件
用户控件:用户控件是能够在其中放置标记和 Web 服务器控件的容器。然后,可以将用户控件作为一个单元对待,为其定义属性和方法。用户控件是一种复合控件,工作原理非常类似于 ASP.NET 网页 - 您可以向用户控件添加现有的 Web 服务器控件和标记,并定义控件的属性和方法。然后可以将控件嵌入 ASP.NET 网页中充当一个单元。
用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整.

3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
装箱和拆箱发生 值类型向引用类型转换,和引用类型向值类型转 重载:同一个函数参数不同
装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚.

4.列举一下你所了解的XML技术及其应用
xml可以用来做网页(xslt) xml可以当作数据库 xml可以用来保存对象的系列化
XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它

5.值类型和引用类型的区别?写出C#的样例代码。
值类型,没有什么好说的.引用类型用处是返回两个以上参数的时候比较好用 ref out 我常用的是out不要先赋值
结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的,这个不用多写了吧.

6.ADO.net中常用的对象有哪些?分别描述一下。
ado.net 我直接用 sqlhelper了 (有connection command 还有参数)
ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation。
DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表,以及所有表的约束、索引和关系。所有这些信息都以XML的形式存在,我们可以处理、遍历、搜索任意或者全部的数据。
DataTable:这个对象代表着可以在DataSet对象内找到的所有表
DataColumn:表包含与列有关的信息,包括列的名称、类型和属性。我们可以按照下面的方式创建DataColumn对象,指定数据类型,然后把列加入到表
DataRow:要填充一个表,我们可以使用命令的自动数据绑定功能,或者也可以手工添加行
DataRelation:这个对象代表着两个表之间的父-子关系。关系建立在具有同样数据类型的列上
DataSet对象:表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表(DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。
DataReader对象:它与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据库。
Connection对象:用于连接数据库的对象,表示到数据源的一个唯一的连接。
Command对象:表示要对数据库执行的一个SQL语句或一个存储过程。
DataAdapter对象:该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等。
Ado.net 是ado的一个后续升级版本,利用它可以操作数据库中的数据! 
VB.net 是VB6.0的一个后续升级版本,它可以直接开发Windows应用程序 
ASP.net 是用于开发WEB应用程序的

7.如何理解委托?
回调机制比较有用的.在net中采用了委托
使用委托更方便!!
买房的人 中介 卖房的人
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值

8.C#中的接口和类有什么异同。
接口,是可以多继承,类只有单继承.接口强调了你必须实现,而没有具本实现的方法和虚类有点相同
异:
不能直接实例化接口。
接口不包含方法的实现。
接口、类和结构可从多个接口继承。但是C# 只支持单继承:类只能从一个基类继承实现。
类定义可在不同的源文件之间进行拆分。
同:
接口、类和结构可从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口可以包含事件、索引器、方法和属性。
一个类可以实现多个接口。

9.。net中读写数据库需要用到哪些类?他们的作用
Connection DataAdapter DataSet Command DataReader
10.UDP连接和TCP连接的异同。
前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.
TCP协议是面向连接的,每个数据包的传输过程是:先建立链路、数据传输、然后清除链路。数据包不包含目的地址。受端和发端不但顺序一致,而且内容相同。它的可靠性高,
UDP协议是面向无连接的,每个数据包都有完整的源、目的地址及分组编号,各自在网络中独立传输,传输中不管其顺序,数据到达收端后再进行排序组装,遇有丢失、差错和失序等情况,通过请求重发来解决。它的效率比较高

11.ASP.net的身份验证方式有哪些?分别是什么原理?
Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活。Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端。服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了。问题来了,在实际是用中我们往往需要的是基于角色,或者说基于用户组的验证和授权。
以前是自己写,一般是利用Cookie或者Session。
asp.net2.0之后提供了MemberShip类身份验证框架。这两种都用过,自己写的自由度大,但是MemberShip和.net其他组件配合更好

12.进程和线程分别怎么理解?
进程简单理解为单个程序吧(按ctrl+alt+del)可以看到的.它至少有一个主线程
进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子

13.什么是code-Behind技术。
代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的

14.活动目录的作用。

15..net中读写XML的类都归属于哪些命名空间?
system.xml (system.io创建目录的时候用)。我自已写的就不一定了

16.解释一下UDDI、WSDL的意义及其作用。

17.什么是SOAP,有哪些应用。
soap简单协议.我只知道.web服务是基于它之上的
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息

18.如何部署一个ASP.net页面。
部置一个页面. 也就是说没有代码是直接写在aspx中的了.只接放在IIS的虚拟目录下就行了.当然要asp.net支持

19.如何理解.net中的垃圾回收机制。
垃圾回收..一般的只要掌握.非托管对象要记得释放资源就行了吧。
GC?对象创建了总要清除啊,不然内存哪够用

20.常用的调用webservice方法有哪些?
直接在vs.net里面引用就OK了.它会自己生成一个代理类
=========================================================================
1..new有几种用法
第一种:new Class();
第二种:覆盖方法 public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。

2.如何把一个array复制到arrayList里
foreach( object o in array )arrayList.Add(o);

3.datagrid.datasouse可以连接什么数据源
dataset,datatable,dataview,IList

4.概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。

5.概述o/r mapping 的原理
利用反射,配置 将类于数据库表映射

6.类成员有( )种可访问形式
可访问形式?不懂。
可访问性:public ,protected ,private,internal

7.用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。

8.列举ADO.NET中的五个主要对象,并简单描述
connection,command,dataReader,trans,dataset ...

9.执行下面代码后:
String strTemp ="abcdefg 某某某";
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
问:i=(14 ) ;j=(11 )
i=(14 ) ;j=(11 ) 中文两个字节

10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配) 
string str ="" 分配空间
11.详述.NET里class和struct的异同!
class:放在 ? struct放在?
struct值传递
类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。

12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。
远程逻辑调用,remoing接口只能用在.net中

13.什么是code-behind技术
aspx and cs

14.概述三层结构体系
web/business/dataaccess

15.asp.net如何实现MVC模式,举例说明!
web/business/dataaccess
=========================================================================
1. 谈谈类和结构的区别?
1. 值类型与引用类型
结构是值类型:值类型在堆栈上分配地址
类是引用类型:引用类型在堆上分配地址

2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然没有明确sealed声明,可结构是隐式的sealed .
类:完全可扩展的,除非显式声明sealed, 否则类可以继承其他类和接口,自身也能被继承 。
注:虽然结构不能被继承 ,可结构能够继承接口,方法和类继承接口一样 。

3.内部结构的区别:
结构:
没有默认的构造函数,可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不用new 初始化
在结构中初始化实例字段是错误的
类:
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用new 初始化
2. C#的优点是什么?至少列出4点
1. C#中指针已经消失. 允许对原始指针的有限制的使用.
2. 基于.NET平台的,继承了自动内存管理和垃圾回收的特点.
3. C#拥有内建的支持来将任何组件转换成一个web service,运行在任何平台上的任何应用程序都可以通过互联网来使用这个服务.
4. 面向对象的
3. C#有哪5种类型的可访问性?
? public:成员可以从任何代码访问。
? protected:成员只能从派生类访问。
? internal:成员只能从同一程序集的内部访问。
? protected internal:成员只能从同一程序集内的派生类访问。
? private:成员只能在当前类的内部访问。
4. C#中引用类型有哪几种?
(类、代表、数组、接口)
5. 对象间可能存在的三种关系?
聚合,一个(较复杂的)对象由其他若干(较简单的)对象作为其构成部分,称作聚合。
关联,对象之间的静态联系(即通过对象属性体现的联系)称作关联。
继承
6. 如何理解.net中的垃圾回收机制。
如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中.然后
会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收.
非托管对象要记得释放资源就行了吧.
7. .net的错误处理机制是什么
错误的处理顺序:finally先,catch次之,最后退会try代码..取消此次操作.返回catch中的异常信息.当然,你也可以定制自己的错误处理机制...如果你的异常处理中包含finally块.则此finally无论是否发生异常始终会被执行...
8. c#中using和new这两个关键字有什么意义?
using 的用途是为某个namespace建立别名,或者引用存在系统中的其它namespace.
New 用来创建实例,或者覆写方法。
9. 什么是重载?override与重载的区别?
重载是指针对所继承下来到方法,重新设计其处理方式,为将来原本处理方式覆盖过去。
在派生类要覆盖的方法前加override修饰,而基类的同名方法前加virtual修饰。这样就能实现多态。多态指一个程序中同名的不同方法共存的情况。 有两种形式的多态– 重载与重写。
10. 值类型和引用类型的区别?写出C#的样例代码。
值类型的变量本身包含他们的数据,而引用类型的变量包含的是指向包含数据的内存块的引用或叫句柄。
值类型变量存储在堆栈。每个程序在执行时都有自己的堆栈,其他程序不能访问。
引用类型存储在堆。引用类型存贮实际数据的引用值的地址。
C#中的引用类型有4种(类、代表、数组、接口)
11. C#代码在执行前要编译为中间语言 ,中间语言的主要特征有?
● 面向对象和使用接口
● 值类型和引用类型之间的巨大差别
● 强数据类型
● 使用异常来处理错误
● 使用属性(attribute)
12. 什么是装箱和拆箱?举例说明。
装箱(boxing)和拆箱(unboxing)机制使得在C#类型系统中,任何值类型、引用类型和object(对象)类型之间进行转换,这种转换称为绑定连接。简单地说,有了装箱和拆箱的概念,对任何类型的值来说最终都可看作是object类型。 1、装箱转换
含义:将一个值类型隐式地转换成一个object类型,或把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,就是创建一个object实例并将值复制给这个object
如: int I=10; object obj=I; 也可用显式的方法进行装箱操作: object obj=(object)I;
2、拆箱转换
和装箱相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或将一个接口类型显式地转换成一个执行该接口的值类型。
过程分两步:
首先,检查这个对象实例,看它是否为给定的值类型的装箱值
然后,把这个实例的值拷贝给值类型的变量。如:
int I=10;
object obj=I;
Int j=(int)obj;
=================================================================================
编程题目
1.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
2.写一个实现对一段字符串翻转的方法 。
class StringReversal
{
public String StrReversal(String oldString)
{
//Convert string to char arry
Char[] oldCharArray = oldString.ToCharArray();
//Reversal from zero
int index = 0;
int cLength = oldCharArray.Length - 1;
while(index
{
//use char CTemp to swap
char cTemp = oldCharArray[index];
oldCharArray[index] = oldCharArray[cLength];
oldCharArray[cLength] = cTemp;
index ++;
cLength --;
}
//Convert char array to string only have the constructor method
string newString = new string(oldCharArray);
return newString;
}
}
3.实现一个冒泡排序算法?
public void BubbleSort(int[] R)
  {
   int i,j,temp; //交换标志
   bool exchange;
   for(i=0; i
   {
   exchange=false; //本趟排序开始前,交换标志应为假
   for(j=R.Length-2; j>=i; j--)
   {
   if(R[j+1]
   {
    temp=R[j+1];
    R[j+1]=R[j];
    R[j]=temp;
    exchange=true; //发生了交换,故将交换标志置为真
   }
   }
   if(!exchange) //本趟排序未发生交换,提前终止算法
   {
   break;
   }
   }
  }
4. 用拷贝的方法来创建数组
using System;
class Test
{ public static void Main(String []args)
{ int [] Array1=new int [5]{4,3,2,1,0};
int [] Array2=(int[])Array1.Clone();
//创建新数组但内容为Array1
for(int i=0; i
{ //获得Array2[i]数组中的某个元素的值并显示出其值
Console.WriteLine("Array2[{0}]:{1}",i,Array2[i]);
}//显示的结果为 4、3、2、1、0
}
}
5.找最大数游戏:有一批数,请你快速地找出最大数及其位置。
6. 九九乘法表
static void Main(string[] args)
{ for(int i=1; i<10; i++)
{ for(int j=1; j<= i; j++)
{ int s = i * j;
Console.Write(j.ToString() + "×" + i.ToString() + "=" + s.ToString() + " ");
}
Console.WriteLine("");

Console.ReadLine();
}
7. 最大公约数
max_gongyue(int m,int n)
{
int i=min(m,n)-1;
for(;i>1;i--)
if((!(m%i))&&(!(n%i)))
break;
return i;
}
8. 求数的阶乘
static void Main(string[] args)
{ while(true)
{Console.Write("请输入一个正整数(输入0退出):");
int x = int.Parse(Console.ReadLine());
if (x == 0)
{break;}
int y = x;
checked
{ for(int i=x-1; i>0; i--)
{y = y * i; }
}
Console.WriteLine("{0}的阶乘是:{1}", x, y);
}
Console.WriteLine("按回车键退出...");
Console.ReadLine();
}
9. 折半查找并显示进度
int BinarySearch(Type a[],const Type& x,int n)
{
int left=0;
int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if (x==a[middle]) return middle;
if (x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
10. 四则运算题目
static void Main(string[] args)
{
Console.WriteLine("输入运算式");
for(int i=0;i
{
Console.WriteLine("输入的参数{0}:{1}",i,args[i]);
}
double a,b;
double y=0;
a=double.Parse(args[0]);
b=double.Parse(args[2]);
switch(args[1])
{
case"+":
{
y=a+b;
break;
}
case"-":
{
y=a-b;
break;
}
case"*":
{
y=a*b;
break;
}
case"/":
{
if(b==0)
{
Console.WriteLine("除数不能为0");break;
}
else{y=a/b;break;}
}

}
Console.WriteLine("结果为:{0}",y);
11.判断彩票是否中奖
输入一组数字(7位),判断这组数字中几等奖,判断规则如下
一等奖:中7个数;二等奖:中6个数
三等奖:中5个数;四等奖:中4个数;五等奖:中3个数
其它的没有中奖
最终打印出中几等奖,如中一等奖打印“一等奖”,没有中奖打印“没有中奖”
注:中奖号码为已知,可以自定义一组整型数组,如:
int [] luck = new int[7];
luck[0] = 0;luck[1] = 1;luck[2] = 2;luck[3] = 3;luck[4] = 4;luck[5] = 5;luck[6] = 6;

posted @ 2014-08-01 09:16  博斯芮网络科技  阅读(690)  评论(0编辑  收藏  举报