C#笔试题目总结

基础

知识点

try catch finally的执行顺序(有return的情况下):

  1. 不管有没有出现异常,finally块中代码都会执行;
  2. 当try和catch中有return时,finally仍然会执行;
  3. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
  4. finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

题目

1.1 CTS、CLS、CLR分别作何解释?
CTS:Common Type System 通用系统类型,一种确定公共语言运行库如何定义,使用和管理类型的规范。
Int32、Int16->int、String->string、Boolean->bool,前者都是.Net中的类型,后者是C#中对这些类型的别名。

CLR:Common Language Runtime 公共语言运行时,.NET Framework 提供了一个称为公共语言运行库的运行时环境,它运行代码并提供使开发过程更轻松的服务。

CLS:Common Language Specification 通用语言规范,要和其他对象完全交互,而不管这些对象是以何种语言实现的,对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。

1.2 能用foreach遍历访问的对象的要求?
需要实现IEnumerable接口或声明GetEnumerator方法的类型。

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

static void Main(string[] args)
{
    Console.WriteLine(Calc());
    Console.ReadKey();
}

static int Calc()
{
    int i = 0;
    try
    {
        return i;
    }
    finally
    {
        Console.WriteLine("finally");
        i++;
    }
}

答案:
finally
0

解答:return先执行,finally后执行,所以return的值是没有i++之前的0。注意并不是return的时候函数真的就“返回、执行结束”了,return只是标记函数的返回值是0,标记完了还会执行finally中的代码,只有finally中的代码执行完成后函数才真正的返回。

1.4 如何把一个Array复制到ArrayList里?
实现1 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);
实现2 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s);
数组是相同类型的集合。数组大小在它声明的时候就固定了。链表和数组相似,但它没有固定的大小。

1.5 什么是强类型,什么是弱类型?哪种更好些?为什么?

//C#中
int i = 3;
i = "a"; //不可以
//JavaScript中
var i = 3;
i = "a"; //可以

强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。
没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。弱类型更灵活,但是效率低,而且出错概率高
一般用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等

1.6 概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性,它是在运行时创建和使用类型实例。
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。

1.7 运算符++?
++ a 表示先将a加1,然后表达式的值为a加1后的值,a ++表示(表达式的值为a,然后a加1)。

1.8 什么是类型参数化?
类型参数化是一个类型在另一个值或者类型之上参数化。

1.9 你对泛型了解吗?简单说明一下泛型的好处?
泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
好处是:类型安全和减少装箱、拆箱;提高性能、类型安全和质量,减少重复性的编程任务。

1.10 new有几种用法?
第一种:实例化对象new Class();
第二种:覆盖基类方法public new XXXX() {}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数

1.11 DateTime.Parse(myString); 这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()。

1.12 为什么不提倡catch(Exception) ,catch(Exception e){ throw e; }和catch(Exception e){throw;},error和exception区别?
第一个将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象,try...catch在出现异常的时候影响性能; 应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等,更多详细请看[异常][2]

error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

1.13 out 和 ref的区别与相同点?
out 和 ref都指示编译器传递参数地址,在行为上是相同的;
他们的使用机制稍有不同,ref要求参数在使用之前要显式初始化,out要在方法内部初始化;out 和 ref不可以重载,就是不能定义Method(ref int a)和Method(out int a)这样的重载,从编译角度看,二者的实质是相同的,只是使用时有区别:

  • 使用ref型参数时,传入的参数必须先被初始化,对out而言,必须在方法中对其完成初始化
  • 使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配
  • out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候

1.14 请解释一下IClonable?
IClonable方法是实现深度复制(Deep Copy)的接口,实现它应该能深度复制一个对象出来。深度复制的特征是调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而浅复制(Shadow Copy)则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone()。

1.15 using关键字有什么用?什么是IDisposable?
using可以声明namespace的引入
还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。using其实等价于try……finally,用起来更方便。

1.16 什么叫应用程序域?什么是受管制的代码?什么是托管代码?
应用程序域为安全性.可靠性.版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。应用程序域提供了一个更安全.用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。
受管制的代码:在.Net环境中运行的任何代码都是受管制的代码(managed code),.Net外部的代码也运行在windows上,这些代码称为未受管制的代码(unmanaged code)。
使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成.跨语言异常处理.增强的安全性.版本控制和部署支持.简化的组件交互模型.调试和分析服务等。

1.17 请叙述const与readonly的区别?
const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。
const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全评估。
const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。

readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作推迟到运行期进行。
readonly 关键字与 const 关键字不同: const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字段可用于运行时常数。
readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。

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

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

1.19 C#的有哪些注释类型?
C#中有三种注释类型:单行(//)、多行(/* */)、Page/XML 注释(///)。

1.20 C#有哪些特点?
简单 类型安全 灵活 面向对象 兼容 持久化 互操作性 有别于传统
C#是一个简单而强大的编程语言,用于编写企业版的应用程序。它是C++和VB的混合体。它保留了许多C++特性,如语句,表达式和运算符并结合了VB的生产力。
C#帮助开发者轻易地构建网络服务,能够通过任何语言,任何平台来访问Internet。
C#帮助开发者用更少的代码完成开发,从而在代码中错误更少。
C#引入了相当大的改进和创新,如类型安全,版本控制,事件和垃圾收集这些领域。

1.21 public、static和void之间的区别是什么?
public:关键字public是访问修饰符,用来告诉C#编译器主(Main)方法可以被任何人调用。
static:关键字static表明主(Main)方法是一个全局方法,不需要穿件类实例即可访问。编译器储存该方法的地址作为切入点,并利用这个信息在任何对象创建之前开始执行它。
void:关键字void是一个类型修饰符表明主(Main)方法不返回任何值。

1.22 C#中有哪些类型的数组?
一维数组、多维数组、交错数组
数组

1.23 什么是交错数组?
交错数组是元素为数组的数组。
交错数组元素的维度和大小可以不同。
交错数组有时称为“数组的数组”。
数组

1.24 C#中支持哪些语句类型?
C#支持的几种不同的语句类型是
块语句 声明语句 表达式语句 选择语句 迭代语句 跳转语句 异常处理语句 检查和未检查 Lock语句

1.25 什么是方法?
方法是由对象或者类执行来实现计算或者操作的成员,静态方法通过类访问,实例方法通过类的实例来访问。

1.26 错误的类型是什么?
语法错误(Syntax error) 逻辑错误(Logic error) 运行时错误(Runtime error)

1.27 break和continue语句之间有什么区别?
break语句是用来终止当前封闭循环或者它所在的条件语句的。
continue语句是用来改变执行顺序的。和break语句那样跳出循环相反,continue语句停止当前迭代并且只将控制返回到循环顶部。

1.28 什么是参数?
参数是用来传递值或者变量引用给方法的。方法的参数从被调用方法时指定的参数得到它们实际的值。有四种参数:值参数,引用参数,输出参数和参数数组。
方法

1.29 C#中运算符的含义是什么?
运算符是界定了对类实例应用特定的运算表达式内涵的成员。可以定义三种类型的运算符:一元运算符,二元运算符和转换运算符。所有的运算符必须声明为public和static的。

1.30 Array和LinkedList之间的区别是什么?
数组是不关心彼此元素位置的简单数字序列。他们之间的位置彼此独立。增加,删除或者修改任何数组元素都是非常容易的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值