.NET 面试题(普适)

1. 填空题

(1)面向对象的语言具有 封装 性、 继承 性、 多态 性。
(2)能用foreach遍历饭访问的对象需要实现 IEnumerable 接口或声明 GetEnumerator 方法的类型。
(3)c#中的三元运算符是 ? :
(4)当整数a赋值给一个object对象时,整数a将会被 装箱
(5)类成员有 3 种可访问形式。(this.;new Class().Method;)(public private protected)
(6)在.NET中所有可序列化的类都被标记为 [serializable]
(7)在.NET托管代码中我们不用担心内存漏洞,这是因为有了 GC处理机制
(8)用sealed修饰的类有什么特点 不可被继承
(9)利用operator声明且仅声明了= =,有什么错误吗?
要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="
(10)列举ADO.NET中的五个主要对象connationcommanddatareaderdataadapterdataset

2. 不定项选择题

  1. 以下叙述正确的是(BC)
    A.接口中可以有虚方法。 B.一个类可以实现多个接口。
    C.接口不能被实例化。 D.接口中可以包含已实现的方法。
  2. 从数据库读取记录,你可能用到的方法有( BCD)
    A.ExecuteNonQuery B.ExecuteScalar C.Fill D.ExecuteReader
  3. 在对SQL Server 数据库操作时应选用( A )
    A.SQL Server .NET Framework 数据提供程序。
    B.OLE DB .NET Framework 数据提供程序。
    C.ODBC .NET Framework 数据提供程序。
    D.Oracle .NET Framework 数据提供程序。
  4. 下列选项中,(C)是引用类型。
    A.enum类型 B.struct类型 C.string类型 D.int类型
  5. c#的数据类型有(B)
    A.值类型和调用类型 B.值类型和引用类型
    C.引用类型和关系类型 D.关系类型和调用类型
  6. 下列描述错误的是(D)
    A.类不可以多重继承而接口可以 B.抽象类自身可以定义成员而接口不可以
    C.抽象类和接口都不能被实例化 D.一个类可以有多个基类和多个基接口
  7. 在DOM中,装载一个XML文档的方法(B)
    A.save方法 B.load方法 C.loadXML方法 D.send方法
  8. 下列关于构造函数的描述正确的是(C)
    A.构造函数可以声明返回类型 B.构造函数不可以用private修饰
    C.构造函数必须与类名相同 D.构造函数不能带参数
  9. 以下是一些c#中的枚举型的定义,其中错误的用法是(ACD)
    A.public enum var1{Mike=100,Nike=102,Jike}
    B.public enum var1{Mike=100,Nike,Jike}
    C.public enum var1{Mike=-1,Nike,Jike}
    D.public enum var1{Mike,Nike,Jike}
  10. int[][] my Array3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][2]的值是(D)
    A.9 B.2 C.6 D.越界

3.简述题

  1. 请简述private、protected、public、internal修饰符的访问权限。
    答:(详述)①public(公开):给类,及所有类成员使用;范围:当前类自身/所有的子类/同一程序集其他类通过实例化也可以访问/其他程序集中的类也可以实例化访问.
    ②private(私有):给类,及所有类成员使用;范围:当前类自身/所有类成员的默认访问修饰符.
    ③protected(受保护的):类,内嵌类的所有成员;范围:当前类自身/所有的子类可以访问/同一程序集其他类不可以访问/其他程序集中可以通过继承也可以访问.
    ④internal:类,内嵌类的所有成员;范围:当前类自身/同一程序集的其他类可以通过实例化访问/同一程序集中的子类也可以访问/其他程序集中不管是不是子类都无法访问.
    ⑤internal protected:类,及内嵌类的所有成员;范围:当前类自身/同一程序集的其他类可以通过实例化进行访问/所有子类可以访问/其他程序集中可以通过继承进行访问,但实例化不行.
    (简述)①public:公开的,运用于类以及类成员,范围:所有代码都可以访问。
    ②private:私有的,运用于类以及类成员,范围:当前类自身,只能在本类中访问,所有类成员默认访问修饰符。
    ③protected:受保护的,类、内嵌类的所有成员,范围:当前类以及所有的子类。
    ④internal:类、内嵌类的所有成员,范围:同一程序集。
    ⑤protected internal/internal protected:类、内嵌类的所有成员,范围:同一程序集和子类。
  2. 请叙述const与readonly的区别。
    答:①Const表示常量,定义的时候就要初始化,静态
    ②readonly只读,定义的时候可以不用初始化,可以延迟到构造方法中进行初始化。
  3. 请叙述类与结构的区别。
    答:①值类型与引用类型:
  • 结构(Struct)是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应system.string 结构 ,通过使用结构可以创建更多的值类型。
  • 类(Class)是引用类型:引用类型在堆上分配地址;堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
    i. 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用;
    ii. 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object;
    iii. 虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
    ②继承性:
  • 结构(struct):不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
  • 类(class):完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
    ③内部结构:
  • 结构(struct):
    没有默认的构造函数,但是可以添加构造函数
    没有析构函数
    没有 abstract 和 sealed(因为不能继承)
    不能有protected 修饰符
    可以不使用new 初始化
    在结构中初始化实例字段是错误的
  • 类(class):
    有默认的构造函数
    有析构函数
    可以使用 abstract 和 sealed
    有protected 修饰符
    必须使用new 初始化

4.数据库题

  1. .NET中读写数据库需要用到哪些类?他们的作用?
    答:①connection:建立与数据库的链接。
    ②command:用来对数据库发出一些指令或存储过程。
    ③datareader:读取数据。
    ④dataadapter:是dataset和数据源之间的桥梁。
    ⑤dataset:把从数据库中所查询到的数据保留起来,存储的是一张表或多张表。
  2. 说出你所了解的数据库访问组件(例如ADO,至少4种)
    答:①微软:MDAC 早期微软产品用的
    ②Java:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用 Java语言编写的类和接口组成。
    ③PDO:PHP上面用的数据库访问层
    ④ADO: ADO (ActiveX Data Objects, ActiveX数据对象 )是Microsoft提出的应用程序接口( API )用以实现访问关系或非关系数据库中的数据。例如,如果您希望编写应用程序从 DB2 或 Oracle 数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。
  3. 写出一条Sql语句:取出表A中第31到第40记录(sql server ,以自动增长的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)
  4. 如何处理百万条数据的优化?
    答:①如果有唯一字段的,创建主键和索引,提高查询主键字段效率;
    ②如果这些数据是变更的,可以通过时间来创建分区;
    ③如果部分老数据都是不需要的数据(不常用),可以定期将老数据备份到其他位置;
    ④如果是查询的话,可以通过分页查询的形式进行,不要一次性读取过多数据。
    详解:https://www.cnblogs.com/aini80216051-/p/7155586.html

5. 结果输出题

  1. 写出下面程序输出的结果
class Class1 {
		private string str = "Class1.str";
		private int i = 0;
		static void StringConvert(string str) {
			str = "string being converted.";
	 	}
		static void StringConvert(Class1 c) {
			c.str = "string being converted.";
		 }
		static void Add(int i) {
			i++;
		}
		static void AddWithRef(ref int i) {
			i++;
		}
		static void Main() {
			int i1 = 10;
			 int i2 = 20;
			 string str = "str";
			Class1 c = new Class1();
			Add(i1);
		 	AddWithRef(ref i2);
		 	Add(c.i);
		 	StringConvert(str);
			StringConvert(c);
		 	Console.WriteLine(i1);
		 	Console.WriteLine(i2);
		 	Console.WriteLine(c.i);
		 	Console.WriteLine(str);
		 	Console.WriteLine(c.str);
	 }
}

输出结果:10;21;0;Str;string being converted.

  1. 写出下面程序的输出结果
public abstract class A
{
	public A()
	{
		Console.WriteLine('A');
	 }
	public virtual void Fun()
	{
		Console.WriteLine("A.Fun()");
	}
}
public class B: A
{
	public B()
	{
		Console.WriteLine('B');
	 }
	public new void Fun()
	{
		Console.WriteLine("B.Fun()");
	}
	public static void Main()
	{
		A a = new B();
		a.Fun();
	}
}

输出结果:
A B
A.Fun()

6.编程题

  1. 一列数的规则如下:1、1、2、3、5、8、13、21、34…求第30位数是多少,用递归和非递归算法实现(C#语言)
    答:①递归算法
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);
  			 } 
		}
 }

②非递归算法

public static void Do2()
{
        Console.WriteLine(Foo2(30).ToString());
 }
 public static int Foo2(int positionIndex)
 {
         if (positionIndex <= 0)
         {
               return 0;
         }
         else if (positionIndex <= 2)
         {
                return 1;
         }
         int index1 = 1;
         int index2 = 1;
         int index = 0;
         for (int i = 2; i < positionIndex; i++)
         {
               index = index1 + index2;
               index1 = index2;
               index2 = index;
          }
          return index;
 }

7.分析题

以下代码段中能否编译通过?请给出理由

try
{
}
catch(FileNotFoundException e1)
{
}
catch(Exception e2)
{
}
catch(IOException e3)
{
}
catch
{
}

结论:不能通过,因为所有的异常都继承Exception,当定义了一个Exception方法后,紧跟其后的IOException就会编译错误,但是catch没有继承Exception方法,不会报错。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆皮没有豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值