• C#/ASP.NET/Javascript/SQL面试题


    以下题目为真实的面试题目,答案中部分由网络搜索转载

    ----------------C#

    1.C#如何显示pdf[有项目经验才知道]

    一:使用Adobe reader提供的COM组件
    1.添加引用
    工具箱---右键---选择项--COM组件--Adobe PDF Reader
    2.使用方法
     OpenFileDialog openFile=new OpenFileDialog();
     open..Filter = "PDF文件|*.pdf";
     openFile.ShowDialog();
     axAcroPDF1.src = openFile.FileName;
     //axAcroPDF1.LoadFile(of.FileName);   //使用方法二
    二:不使用Adobe reader提供的COM组件
    http://www.codeproject.com/KB/silverlight/BlendPDFwithSilverlight.aspx
    http://www.codeproject.com/KB/applications/PDFViewerControl.aspx
    或者其它开源方案

    2.如下三个函数之间有什么不同[基础]

    1 void test(string s)                test(ss)
    2 void test(ref string s)            test(ref ss) 
    3 void test(out string s)            test(out ss)

    答案:

    test(string s)  调用前传入的参数s必须初始化(包括null),如果test函数内部修改了s的值,传入的参数不会改变
    test(ref string s) 调用前传入的参数s必须初始化(包括null),如果test函数内部修改了s的值,传入的参数也会改变
    test(out string s) 调用前传入的参数s不需要初始化,如果test函数内部修改了s的值,传入的参数也会改变 

    3.运行时异常和普通异常异同

    普通异常:可捕捉的,可恢复异常,比如IO异常
    运行时异常:不可捕捉,由系统进行处理的,无法恢复的错误
    http://www.cnblogs.com/air5/archive/2011/11/07/2239399.html

    4.请描述链式委托是什么

    即 委托链,委托内部通过链表的方式将注册的方法进行保存,然后依次调用

    5.C#实现了那几种可访问性级别

    1 public               访问不受限制。
    2 protected            访问仅限于包含类或从包含类派生的类型。
    3 internal             访问仅限于当前程序集。
    4 protected internal   访问仅限于从包含类派生的当前程序集或类型。
    5 private              访问仅限于包含类型。

    6.如何设置线程池并发线程的最大最小数量[这个题目脑残,除非记得很清楚,不然即使用过也很容易忘记]

    1 System.Threading.ThreadPool.SetMaxThreads(50, 2000);
    2 System.Threading.ThreadPool.SetMinThreads(50, 2000);

    7.同步块和同步快索引的机制[线程]

    http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html
    http://genwoxuedotnet.blog.51cto.com/1852748/504107

    8.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。[线程]

     1 public void test(int i) 
     2  { 
     3     lock(this) 
     4    { 
     5       if (i > 10) 
     6      { 
     7           i--; 
     8           test(i); 
     9       } 
    10     } 
    11  }

    答案:根据网上的资料,大都回答如下:

    1)不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

    经过实际程序验证和这种说法的结果是一致的,但是也另外一种说法,参看2)
    以下是测试程序:
     1 public class Printer
     2 {
     3     public  void test(int i) 
     4     { 
     5         lock(this) 
     6         { 
     7             if (i > 10) 
     8             { 
     9             
    10                 i--; 
    11                 test(i); 
    12                 Console.WriteLine(i);
    13             } 
    14         } 
    15     }
    16     public  void test(object aa) 
    17     {
    18         int i=20;
    19             lock(this) 
    20             { 
    21                 if  (i > 10)
    22                 { 
    23                     i--; 
    24                     Console.WriteLine("{0}\t{1}",i,aa);//去掉此句会产生异常StackOverflowException
    25                     test(aa);                 
    26                 } 
    27             }     
    28     }
    29 }
    30 
    31 //调用
    32     public static void Main()
    33     {
    34         Printer p = new Printer();
    35         p.test(25);//不死锁
    36 
    37         try{
    38             p.test("aaaaa");
    39         }
    40         catch( Exception  e)
    41         {
    42             Console.WriteLine(e);
    43         }
    44     }

    2)《CLR via C#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句。

    来源于:http://www.cnblogs.com/myshell/archive/2010/07/18/1780386.html

    参考

    http://www.cnblogs.com/csharp4/archive/2010/06/11/1756276.html
    http://blog.csdn.net/xuexiaodong2009/article/details/6336696
    http://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx

    9.有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…[线程]

     1 public void PrintABC()
     2 {
     3     int count=0;
     4     string name=System.Threading.Thread.CurrentThread.Name;            
     5     while (count<10)
     6     {                
     7         if (ppp=="c" && name=="a" || ppp=="a" && name=="b" || ppp=="b" && name=="c" )
     8         {
     9                 //System.Console.Write("{0}{1}",count,name);
    10                 System.Console.Write("{0}",name);
    11                 ppp=name;
    12                 count++;
    13         }                
    14     }                
    15 }
    16 
    17 
    18 //调用
    19 for    (char c='a';c<'d';c++)
    20 {
    21     Thread tt=new Thread(new ThreadStart(t.PrintABC));    
    22     tt.Name=c.ToString();
    23     tt.Start();
    24 }
    25         

    10.假如有字符串“6sabcsssfsfs33” ,用最快速的方法去掉字符“ab3”,不能用内置字符串方法(indeOf,substring,replaceAll等)? 

    [老实说不知道要考什么]

     最快的不知道,随便写一个

     1 public string RemoveAB3(string s,string rs)
     2 {        
     3     string tmp="";
     4     for(int i=0;i<s.Length;i++)
     5     {
     6         bool bExist=false;
     7         //here,use hashset for rs 
     8         for(int j=0;j<rs.Length;j++)
     9         {                
    10             if (s[i]==rs[j])
    11             {
    12                 bExist=true;
    13             }                
    14         }
    15         if (!bExist) tmp+=s[i];
    16     }
    17     return tmp;
    18 }
    19 //调用
    20 string s="6sabcsssfsfs33";
    21 string s1="ab3";
    22 System.Console.WriteLine("{0}\n{1}",s,t.RemoveAB3(s,s1));

    ----------------ADO.NET

    1.ADO.NET常用5个类的名称[一般用过的大概都知道,悲惨是如果一开始就是用orm的,就不一定知道了]

    DataSet
    Connection
    Command
    DataReader
    DataAdapter

    2.下面四个方法,哪些可以返回数据[同上]

    ExecuteNonQuery :执行 Transact-SQL INSERT、DELETE、UPDATE 及 SET 语句等命令。
    ExecuteScalar :从数据库中检索单个值(例如一个聚合值)。
    ExecuteReader :执行返回行的命令。
    还有一个忘记

    ----------------ASP.NET

    1.Asp.Net部署有哪几种方法

    方法1:---直接复制到IIS目录发布目录中(C:\Inetpub\wwwroot)
    方法2:---使用Vs2008的IDE自带的发布功能, 进行发布操作.
    方法3: ---使用虚拟目录发布网站.
    http://www.cnblogs.com/mishchael/articles/1897131.html

    2.简单描述<%# eval("xxx")   %>机制

     Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,进行数据绑定 
    http://www.cnblogs.com/oec2003/archive/2009/01/14/1375868.html
    http://www.cnblogs.com/mr_jinrui/archive/2010/07/06/1772129.html

    3.写出Asp.net页面生命周期中的事件

    参考http://msdn.microsoft.com/zh-cn/library/ms178472.aspx

    ----------------SQL

    1.SQL行转列(具体题目忘记,以如下例子代替)[case when ,sum,group by]

    表格数据:
    name,paytype,money,datatime
    小李    支付宝   20   2012-01-03 00:00:00.000
    小陈    工行     40   2012-01-06 00:00:00.000
    小赵    交行     60   2012-01-06 00:00:00.000
    小陈    支付宝    80   2012-01-06 00:00:00.000
    小赵    工行     100    2012-01-16 00:00:00.000
    小张    中行     120    2012-01-16 00:00:00.000
    小李    支付宝    140    2012-01-16 00:00:00.000

    请按照如下格式显示(银行的顺序不限制),每一个人在各银行的消费总和

    name,支付宝,工行,交行,中行
    小陈   80   40   0    0
    小李   160  0    0    0
    小张   0    0    0    120
    小赵   0    100  60   0

    答案:主要使用case when、sum、和group by

    测试表格和数据

     1 --------创建行转列测试表格
     2 create table PayPhoneMoney
     3 (
     4     id int identity(1,1),
     5     userName nvarchar(20),
     6     payType nvarchar(20),
     7     money decimal,
     8     payTime datetime,
     9     constraint pk_id primary key(id)
    10 )
    11 
    12 go
    13 
    14 --------插入行转列测试数据
    15 delete from PayPhoneMoney
    16  insert into PayPhoneMoney values('小李','支付宝',20,'2012-01-03')
    17  insert into PayPhoneMoney values('小陈','工行',40,'2012-01-06')
    18  insert into PayPhoneMoney values('小赵','交行',60,'2012-01-06')
    19  insert into PayPhoneMoney values('小陈','支付宝',80,'2012-01-06')
    20  insert into PayPhoneMoney values('小赵','工行',100,'2012-01-16')
    21  insert into PayPhoneMoney values('小张','中行',120,'2012-01-16')
    22  insert into PayPhoneMoney values('小李','支付宝',140,'2012-01-16')
    23 
    24 --------显示所有测试行数据
    25 select  * from PayPhoneMoney username

    方法1:

    1 --------如果行转列中的列式有限且已知的几个,可以使用它case when语句
    2 select username ,
    3 sum(case payType when '支付宝' then money else 0 end) as '支付宝',
    4 sum(case payType when '工行' then money else 0 end) as '工行',
    5 sum(case payType when '交行' then money else 0 end) as '交行',
    6 sum(case payType when '中行' then money else 0 end) as '中行'
    7 from PayPhoneMoney
    8 group by username

    方法2:

     1 --------如果行转列中的列,是动态的且未知个数,使用如下方式
     2 --------原理就是根据通过select Distinct产生获取动态列对应的行,然后通过这些行以case when语句产生对应的列
     3 declare @cmdText varchar(8000)
     4 set @cmdText='select userName, '
     5 select @cmdText=@cmdText+' sum(case payType when '''+payType+''' then money else 0 end) as '''+payType
     6  +''','+char(10) from (select Distinct payType from PayPhoneMoney) T
     7 print @cmdText--发现最后多一个逗号下面把逗号去掉
     8 set @cmdText=left(@cmdText,len(@cmdText)-2)--去掉逗号
     9 set @cmdText=@cmdText+' from PayPhoneMoney group by userName'
    10 print @cmdText
    11 exec(@cmdText)

     2.内连接、左连接、右连接、全连接、交叉连接[前三个常用]

    概念不解释,请自行搜索

    例子:

    部门表:id,name
    雇员表:id,name,salary,title,manager,dept_id

    测试数据:

     1 create table department
     2 (
     3     id int identity(1,1),
     4     name nvarchar(30),
     5 )
     6 go
     7 
     8 create table employee
     9 (
    10     id int identity(1,1),
    11     name nvarchar(30) not null,
    12     salary money,
    13     title nvarchar(30),
    14     manager int,
    15     dept_id int,
    16 
    17 )
    18 go
    19 
    20 insert into department values('人力资源');
    21 insert into department values('开发中心');
    22 insert into department values('总裁室');
    23 
    24 insert into employee values('赵六',19000,'项目经理',null,2);
    25 insert into employee values('王五',17000,'项目组长',4,2);
    26 insert into employee values('张三',16000,'程序员',3,2);
    27 insert into employee values('李四',17000,'HR',4,1);
     1 --内连接:是最常用的链接,也叫等值链接 
     2 --不管限制条件在on中还是在where中,内连接都得到笛卡尔积中满足所有条件的记录。对于inner join, on和where的效果是一样的。 
     3 --1)当没有限制条件,此时为笛卡尔积: 
     4 select * from employee,department
     5 select * from employee inner join department on 1=1
     6 --2)此时如果加上where限制条件,则对上面笛卡尔积的每一条记录看它是否满足限制条件,如果满足,则它在结果集中。
     7 select * from employee emp,department dept where emp.dept_id=dept.id
     8 select * from employee emp inner join department dept  on emp.dept_id=dept.id
     9 select * from employee emp cross join department dept  where emp.dept_id=dept.id
    10 --左连接(left join): 
    11 --1)当没加限制条件时,得到笛卡尔积,同内连接没加限制条件一样 [
    12 select * from employee left join department on 1=1
    13 --当添加特定条件时: 
    14 select * from department
    15 select * from employee
    16 select * from employee emp left join department dept on emp.dept_id=dept.id
    17 --右连接(right join): 
    18 select * from employee emp right join department dept on emp.dept_id=dept.id
    19 --全连接:
    20 --会从左表 (employee) 和右表 (department) 那里返回所有的行。如果 "employee" 中的行在表 "department" 中没有匹配,或者如果 "department" 中的行在表 "employee" 中没有匹配,这些行同样会列出 
    21 select * from employee emp full join department dept on 1=1

    3.Union

    合并两个数据表格,要求两个表列数相同,且对应列的类型是相似的

    4.数据库有几种锁[]

    独占锁
    共享锁
    更新锁
    ...

    5.数据库分页[常用,但是一般都是调用写好的存储过程]

    方法很多,请自行搜索,这里写一个简单的,但是效率不高的

    1 select top @PageSize * from tb where id not in
    2 (
    3     select top (@PageIndex-1)*@PageSize id from tb order by id asc
    4 )order by id asc;

     6.怎么防止sql注入

    使用参数化查询方式(禁止拼凑字符串)

    7.索引[提高效率的好方法]

    好多个,请自行搜索

    8.数据库优化

    加索引 ,分布式数据库,横向切割表等等

    9.如下两表

    --订单
    create table  [Order]
    (
         
        OrderID int identity(1,1),
        CreateTime datetime,
    )
    --订单行
    create table  OrderLine
    (
         
        OrderLineID int identity(1,1),
        money decimal,
        Price decimal,
        count int,
        OrderID int,       -->Order.OrderID
    )

    1)请写出当天所有Order的OrderLine

    select *   from OrderLine where orderid in (select orderid from [Order] where CreateTime between  '2010-12-11 00:00:00' and  '2010-12-11 23:59:59')
    --or
    select OrderLine.*   from OrderLine  right join [Order] on OrderLine.orderid=[Order].orderid where [Order].CreateTime between  '2010-12-11 00:00:00' and  '2010-12-11 23:59:59'

    2)请列出每一笔总金额超过200的Order[考察对having和sum的运用]

    select * from [Order] where orderid in (select orderid   from OrderLine group by orderid having sum(money*count) >200)
    --or
    select [Order].*   from [Order] left join (select orderid   from OrderLine group by orderid having sum(money*count) >200) b on b.orderid=[Order].orderid

    3)忘记了

     10.请说出Cast和Convert的区别

    http://hi.baidu.com/s_s_o_o/item/843c6d0c4e5d8d2ea1312deb

    ----------------Javascript
    1.javascript/jquery实现字符串判断函数,长度在5-15之间,首字符必须是字母,其它字符可以是字母数字和下划线

    [考察对正则表达式的运用]

    1 function test(str)
    2 {
    3     var aa=/^[a-zA-Z]{1,1}[a-zA-Z0-9_]*$/gi;
    4     return (str.length>=5 && str.length<=15)  && aa.test(str) ;
    5 }
    6 //调用    
    7 var s="q1q_sdsdddddddd";
    8 alert(test(s));

    2.Ajax的工作原理

    http://blog.csdn.net/yakihappy/article/details/3976960

    3.Ajax的中文或者英文全称[莫名其妙的题目]

    Asynchronous JavaScript and XML(非同步的JavaScript与XML)

    ----------------CSS

    1.如何使容器(假设为DIV)水平和垂直同时居中

     1 .mainbar {
     2     /*必须设定高度和宽度*/
     3     width:500px;
     4      height:400px;
     5      /*设定绝对定位*/
     6     position: absolute; 
     7     /*将其左上顶点的位置放置于父容器的正中间*/
     8     top: 50%;
     9     left:50%;
    10     /*向上平移自身高度的一半,向左移动自身宽度的一半*/
    11     margin-top: -200px;
    12     margin-left:-250px;
    13  
    14     background:green;
    15 }
    1 <div class="mainbar"></div>

     注意要点:

    1)高度和宽度必须指定值
    2)使用绝对定位
    3)top和left必须设定为50%
    4)margin-top和margin-left必须设定为自身高度和宽度的一半,且都为负值

    2.三列div结构的实现方法

     1 //CSS
     2 <style type="text/css">
     3 * {
     4     margin:0;
     5     padding:0
     6 }
     7 .l-sidebar {
     8     width:200px;//必须设置
     9     height:500px;
    10     position:absolute;//必须固定
    11     top:0;
    12     left:0;
    13     background:blue;
    14 }
    15 .mainbar {
    16     margin-left:200px;//左边容器宽度
    17     margin-right:300px;//右边容器宽度
    18     height:500px;
    19     background:green;
    20 }
    21 .r-sidebar {
    22     width:300px;//必须设定
    23     height:500px;
    24     position:absolute;//必须固定
    25     top:0px;
    26     right:0px;
    27     background:blue;
    28 }
    29 </style>
    1 //HTML
    2 <div class="l-sidebar"></div>
    3 <div class="mainbar"></div>
    4 <div class="r-sidebar"></div>
    简言之:左右容器固定位置,且都设定宽度,中间容器margin左右容器的宽度

    还有其它方式,请自行搜索

    3)左右两列div实现

     1 <style type="text/css">
     2 * {
     3     margin:0;
     4     padding:0
     5 }
     6 .l-sidebar {
     7     width:200px;
     8     height:500px;
     9     position:absolute;
    10     top:0;
    11     left:0;
    12     background:blue;
    13 }
    14 .mainbar {
    15     margin-left:200px;//此宽度就是左边容器宽度
    16     
    17     height:500px;
    18     background:green;
    19 }
    20 
    21 </style>
    1 <div class="l-sidebar"></div>
    2 <div class="mainbar"></div>

    ----------------XML

    1.

     1 <?xml version="1.0" encoding="UTF-8" ?> 
     2 
     3 <?xml-stylesheet type="text/xsl" href="./employee.xsl"?>
     4 
     5 <root>
     6     <manager id="1001"/>
     7     <emplyee id="1001" >
     8         <name>韦小宝</name>
     9         <age>32</age>
    10         <sex>male</sex>
    11     </emplyee>
    12     <emplyee id="1002" >
    13         <name>张夏宏</name>
    14         <age>26</age>
    15         <sex>male</sex>
    16     </emplyee>
    17     <emplyee id="1003" >
    18         <name>刘德华</name>
    19         <age>27</age>
    20         <sex>male</sex>
    21     </emplyee>
    22     <emplyee id="1004" >
    23         <name>翁虹</name>
    24         <age>25</age>
    25         <sex>female</sex>
    26     </emplyee>
    27     <emplyee id="1005" >
    28         <name>车晓</name>
    29         <age>35</age>
    30         <sex>female</sex>
    31     </emplyee>
    32 </root>

    1)请用xpath表示出唯一的经理的名字

    1 <xsl:value-of select="/root/emplyee[@id=/root/manager[1]/@id]/name/text()"/>
    2 //or
    3 <xsl:value-of select="/root/emplyee[@id='1001']/name/text()"/>

    2)统计年龄在26岁以上员工的数量

    1 <xsl:value-of select="count(/root/emplyee[age>26])"/>

    3)显示所有女性员工名称

    <xsl:for-each select="/root/emplyee[sex/text()='female']">
        <xsl:value-of select="./name/text()"/>
    </xsl:for-each>

    4)剩下的几个忘记了 

    ----------------算法题----[这种题目适合刚毕业的,老鸟们一般都不太记得]

    1)用非递归和递归算法分别实现 斐波拉契序列:1,1,2,3,5,8,13

     1 public class Fibonacci 
     2 {
     3     //非递归
     4     public uint Calc(uint n)
     5     {
     6         uint nCur,nF,nL;
     7         nCur=nF=nL=1;
     8         if (n==1 ||n==2)
     9         {
    10             return nCur;
    11         }        
    12         for(uint i=3;i<=n;i++)
    13         {
    14             nCur=nF+nL;
    15             nF=nL;
    16             nL=nCur;
    17         }
    18         return nCur;
    19     }
    20     //递归
    21     public uint Calc1(uint n)
    22     {
    23         return (n==1 ||n==2)?1:Calc1(n-1)+Calc1(n-2);
    24     }
    25 }

    2.已知0!=1,1!=1,2!=2*1!,3!=3*2!........n!=n*(n-1)!

    请给定x,计算下面序列,1!,3!,5!.......(2x+1)!

    ----------------其它 

    1.一个大矩形内部剪掉一个小矩形,大矩形完全包含剪掉的掉矩形,请在大矩形中画一条直线,将大矩形剩余部分分成面积相等的区域

  • 相关阅读:
    Android使用SQLite数据库(2)
    Android使用SQLite数据库(1)
    使用Eclipse为Android定义style
    SharedPreferences写入和读出数据
    AlertDialog.Builder弹出对话框
    Android退出时关闭所有Activity的方法
    获取PC或移动设备的所有IP地址
    Android文件的分割和组装
    到底什么是跨域?附解决方案!
    超详细 Nginx 极简教程
  • 原文地址:https://www.cnblogs.com/simfe/p/2744987.html
Copyright © 2020-2023  润新知