C#面试题

一、填空题

 

1、面向对象的语言具有(继承性)、(封装性)、(多态性)。

 

2、能用foreach遍历访问的对象需要实现(IEnumerable )接口或声明(GetEnumerator())方法的类型。

 

3、在Asp.net中所有的自定义用户控件都必须继承自(Control)。

 

4、在.Net中所有可序列化的类都被标记为([Serializable])。

 

5、在.Net托管代码中我们不用担心内存漏洞,这是因为有了(GC)。 

6、声明静态变量的关键字是(static),声明常量的关键字是(const)。  

7、B/S通常使用的结构设计模型分为(模型)(视图)(控制器)。(MVC经典的Web/Business/DataAccess) 

8、.NET Framework数据提供程序的4个核心对象(Connection)、(Command)、(DataReader)、(DataAdapter)。

       ADO.NET中常用5个对象:(Connection)、(Command)、(DataReader)、(DataAdapter)、(DataSet)。

9、Command对象的主要方法:(ExecuteNonQuery())、(ExecuteReader())、(ExecuteScalar())。

10、类的成员:(字段)、(属性)、(方法)。

11、C#委托的关键字(delegate)。

 

二、简答题

 

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

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

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

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

internal: 在同一命名空间内可以访问。

sealed: 密封类,用它修饰的类是不能被继承的。

2、C#中,string str = null 与 string str ="",请尽量用文字说明区别。

答:string str ="" 分配空间而string str = null不分配空间。

3、请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
答:session(viewstate) 简单,但易丢失 。
application 全局。
cookie 简单,但可能不支持,可能被伪造。
input ttype="hidden" 简单,可能被伪造 url参数简单,显示于地址栏,长度有限数据库稳定,安全,但性能相对弱。

4、请简述ADO.NET中常用对象。

答:Connection:建立于特定数据源的连接。

Command:对数据源执行命令。

DataReader:从数据源中读取只进且只读的数据流。

DataAdapter:用数据源填充DataSet并解析更新。

DataSet:是一个临时存储数据的地方,位于客户端的内存当中。它不和数据库直接打交道,而是通过DataAdapter对象和数据库联系。

5、请简述Command对象的主要方法。

答:ExecuteNonQuery():用于执行指定的SQL语句,如Update、Insert、Delete,它返回的是受SQL语句影响的行数。

ExecuteReader():执行查询命令,返回DataReader对象。

ExecuteScalar():返回单个值,如执行COUNT(*)。

6、请简述DataReader与DataSet的异与同。

答:DateSet可以在断开数据库连接的情况下操作数据,对数据进行批量操作,数据集(DataSet)是一个临时存储数据的地方,位于客户端的内存当中。它不和数据库直接打交道,而是通过DataAdapter对象和数据库联系的。

DateReader适用于:只读取查询结果;节省内存,提高性能。但是使用DateReader读取数据时,不能够对它们进行修改,所以它是只读 的。而且在读取数据的时候,要始终保持与数据库的连接。使用DateReader读取数据的时候占用了数据库连接,必须调用它的Close()方法关闭 DateReader,才能够用数据库连接(Connection)进行其他操作。

7、描述方法的重载。

答:方法的重载支持两种方式,一种是参数是不同类型的重载,另一种是参数个数不同的重载。在方法重载中,不允许仅仅返回值类型不同的方法的重载。

8、类和结构的区别。

答:类是引用类型,结构是值类型。值类型转换成引用类型的过程为装箱,引用类型转换成值类型称为拆箱。

9、描述值类型和引用类型。

答:值类型:值类型源自System.ValueType家族,每个值类型的对象都有一个独立的内存区域保持自己的值。只要在代码中修改它,就会在它的内存区域内保存这个值。

引用类型:引用类型源自System.Object家族,它存储的是对值的引用,就好比存储值得对象是一个气球,而我们的引用变量是一根线。

值类型转换成引用类型的过程为装箱,引用类型转换成值类型称为拆箱。

值类型包括:基础数据类型(int、long、float、char、bool)、枚举类型、结构类型。(基本数据类型其实也是结构)

引用类型包括:类、接口、数组。

10、使用泛型的好处。

答:泛型的主要应用之一是泛型集合,泛型集合可以约束它所存储的对象的类型,提高了数据的安全性。使用集合中的元素时无须装箱、拆箱,提高了运行效率。

11、简述类的特性。

答: 封装:保证对象自身数据的完整性、安全性。

继承:建立类之间的关系,实现代码复用,方便系统的扩展。

多态:相同的方法调用可实现不同的实现方式。

12、描述抽象方法和虚方法的区别。

答:抽象方法和虚方法都可以实现多态性;

抽象方法:通过abstract关键词声明。抽象方法不允许有方法体。抽象类中的方法并不一定都是抽象方法;抽象类也可以容纳具体实现的方法,或者称为具体方法。但是,含有抽象方法的类必然是抽象类抽象类不能被实例化。一个类继承抽象类后,在子类中必须实现抽象方法,使用override关键字来重写抽象方法。

虚方法:通过virtual关键词声明。虚方法必须有方法体。被继承后,在子类中可以重写虚方法,使用override关键字来重写虚方法。

13、简述接口。

答:1、在C#中,一个类不能继承多个类,但可以实现多个接口。2、接口是一种规范和标准。3、接口屏蔽了实现的细节。4、接口的使用方便团队协作开发。

14、什么是SQL注入,如何防范。

答:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度,对关键词进行过滤。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

 

三、编程题

1、使用ADO.NET向Student表插入一条数据信息。

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. using System.Data.SqlClient;  
  2. //新增学生信息  
  3. public void AddStudent(String name, int age)  
  4. {   
  5.     //创建Connection对象  
  6.     string connString = "Data Source=.;Initial Catalog=MyStudyDB;User ID=sa;pwd=sa";  
  7.     SqlConnection connection = new SqlConnection(connString);  
  8.     connection.Open();  
  9.   
  10.     //创建Command对象  
  11.     string sql = String.Format("INSERT INTO Student(StudentName,Age) VALUES('{0}',{1})", name, age);  
  12.     SqlCommand command = new SqlCommand(sql, connection);  
  13.     int result = command.ExecuteNonQuery();  
  14.     if (result > 0)  
  15.     {  
  16.         Console.WriteLine("执行成功");  
  17.     }  
  18.     else  
  19.     {  
  20.         Console.WriteLine("执行失败");  
  21.     }  
  22.     //关闭连接  
  23.     connection.Close();  
  24. }  

2、  1、1、2、3、5、8、13、21、34......求第30位数是多少,用递归算法实现。

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. static void Main(string[] args)  
  2. {  
  3.     fun(30);  
  4. }  
  5.   
  6. public static int fun(int n)   
  7. {  
  8.     if (n == 0 || n == 1)  
  9.     {  
  10.         return 1;  
  11.     }  
  12.     else  
  13.     {  
  14.         return fun(n - 1) + fun(n - 2);  
  15.     }  
  16. }  

3、请用冒泡法排序从大到小。

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. static void Main(string[] args)  
  2. {  
  3.     int[] num = { 3, 7, 1, 5, 6, 2, 4 };  
  4.     int temp = 0;  
  5.     for (int i = 0; i < num.Length; i++)  
  6.     {  
  7.         for (int j = i + 1; j < num.Length; j++)  
  8.         {  
  9.             if (num[i] < num[j])  
  10.             {   
  11.                 temp = num[i];  
  12.                 num[i] = num[j];  
  13.                 num[j] = temp;  
  14.             }  
  15.         }  
  16.     }  
  17. }  

4、基于SQL语句的分页。

 

[sql] view plain copy
 
 在CODE上查看代码片派生到我的代码片
    1. SELECT TOP pageSize *  
    2. FROM 表  
    3. WHERE 条件   
    4. AND id NOT IN(  
    5.     SELECT TOP pageSize * (pageIndex - 1) id  
    6.     FROM 表  
    7.     WHERE 条件 ORDER BY 排序条件  
    8. )  
    9. ORDER BY 排序条件  

 

转自:http://blog.csdn.net/pan_junbiao/article/details/17462763

posted on 2016-09-07 18:17  jameshappy  阅读(282)  评论(0编辑  收藏  举报