C# 面试题大全

1. 类成员有**++2++** 种可访问形式?注: this.new Class().Method

2. public static const int A=1;这段代码有错误么?是什么?++const++ ++成员都是++ ++static++ ++所以应该去掉++ ++static.++

3. float f=-123.567F; int i=(int)f;
i的值现在是**++-123++**

4. 利用operator声明且仅声明了==,有什么错误么? 要同时修改Equale和GetHash() ? ++重载了++ ++"=="++ ++就必须重载++ ++"!="++ 注: operator 是运算符重载

5. 面向对象的语言具有 ++继承性++++封装性++++多态性++

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

7. 用sealed修饰的类有什么特点?++不可被继承++

8. 在.Net中所有可序列化的类都被标记为**++[serializable]++**

9. 在.Net托管代码中我们不用担心内存漏洞,这是因为有了**++GC++**

10. 下面的代码中有什么错误吗?

using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F();
}

++abstract override++ ++是不可以一起修饰++

11. 当类T只声明了私有实例构造函数时,则在T的程序文本外部,++不可以++ (可以 or 不可以)从T派生出新的类,++不可以++ (可以 or 不可以)直接创建T的任何实例。

12. try {} 里有一个 return 语句,那么紧跟在这个 try 后的 finally {} 里的 code 会不会被执行,什么时候被执行,在 return 前还是后 ?
**答:**会执行,在return前执行。

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

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

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

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

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

protected internal(同internal protected):当前程序集里的当前类、当前类的派生类都可以访问,但其他程序集派生当前类的不能访问。

private < protected internal(internal protected) < protected / internal < public

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

  1. 使用QueryString, 如....?id=1; response. Redirect()....
    2.使用Session变量
    3.使用Server.Transfer

15. 请说明在 .net 中常用的几种页面间传递参数的方法,并说出他们的优缺点。

1.session(viewstate) 简单,但易丢失
2.application 全局
3.cookie 简单,但可能不支持,可能被伪造
4.input type="hidden" 简单,可能被伪造
5.url参数简单,显示于地址栏,长度有限
6.数据库稳定,安全,但性能相对弱

16. 重写 (override) 与重载 (overload) 的区别。

重写(override)用来重写父类有相同名称和参数的方法;重载(overload)使用相同名的方法但有不同的参数个数或不同的参数类型。

17. .net的错误处理机制是什么

.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

18. C#中接口和类的异同

接口和类都是类。不同的是,

接口只包含方法和属性的声明,不包含具体实现方法的代码,接口可以实现多继承,接口主要定义一种规范,统一调用方法。

类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。

19. DataReader和DataSet的异同

DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库,任何对SqlConnection的操作都会引发DataReader的异常,因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的,因为DataReader的特殊性和高性能,所以DataReader是只进的,你读了第一条后就不能再去读取第一条了。

DataSet则是将数据一次性加载在内存中,抛弃数据库连接,读取完毕即放弃数据库连接,因为DataSet将数据全部加载在内存中.所以比较消耗内存,但是确比DataReader要灵活,可以动态的添加行、列、数据,对数据库进行回传更新操作。

20. 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?

Using 引入一个命名空间,或在使用了一个对像后自动调用其IDespose。

New 实例化一个对像;或修饰一个方法,表此完全重写此方法

21. using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){

Console.WriteLine("This is class B method!");//(加不加都一样)

}
}
class B:A
{
int x=1;
int y;
public B()[:base()]{
y=-1;
}
public override void PrintFields(){
Console.WriteLine("x={0},y={1}",x,y);
}

}
当使用new B()创建B的实例时,产生什么输出?++X=1,Y=0++

分析:1. 在new B 时会先调父类即A 的构造函数,这时会执行 PrintFields() 方法,因为 PrintFields 为虚拟方法,在子类中又重写了该方法,所以实际执行是子类 B 中的 PrintFields() 方法;

2. 为什么y=0? 这是因为调用的是父类的构造函数,子类B 中的y 还没有初始化,系统赋值为0.

22. 谈谈类和结构的区别?

结构(struct): 值类型,不能被继承(可以继承接口),没有默认的构造函数(可以添加构造函数)和析构函数,不能有abstract、sealed(因为不能被继承)、protected.

类(class): 引用类型,完全可扩展,有默认的构造函数(还可以添加构造函数)和析构函数.

23. .net C# or vb.net )中, Appplication.Exit 还是 Form.Close 有什么不同?
答案 : 一个是退出整个应用程序,一个是关闭其中一个form

24. 在C#中有一个double型的变量,比如10321.5和122235401.21644,作为货币的值如何按各个不同国家的习惯来输出?(比如美国用10,321.50和122,235,401.22而在英国则为£10 321.50和£122 235 401.22)

System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");

//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");//为英国货币类型

decimal y = 10321.5m;

string str = String.Format(MyCulture,"My amount = {0:c}",y);

输出:$10,321.5(美国); £10,321.5(英国)

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

26. 概述 O/R Mapping 的原理
利用反射,配置将类于数据库表映射

27. 密封 sealed 修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其它类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。

28. 概述 .NET 里对 remoting webservice 两项技术的理解和实际中的应用
webservice: 平台独立性, 跨语言, 穿透企业防火墙,基于http的是无状态的, 速度比较慢。

Remoting: 既可以使用TCP信道进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的通信,可以用于有状态的情况,效率相对WebService要高不少,

只能应用于.net framework之下。

29. 什么是 code-behind 技术

代码分离技术,也就是.net中的HTML代码(.aspx)和程序代码(.cs)分别位于不同的文件

30. 什么叫应用程序域?

应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。

31. 什么是受管制的代码?

在CLR虚拟机中运行的代码(在.net环境中运行的代码都称之为受管制的代码)。

在.net环境之外,在Windows上运行的代码称之为不受管制的代码

32. 什么是强类型系统?

C# 是强类型语言;因为每个变量和对象都必须具有声明类型。

33. 什么是装箱和拆箱?

装箱就是隐式的将一个值型转换为引用型对象。

拆箱就是将一个引用型对象转换成任意值类型

34. CTS CLS CLR 分别作何解释

CTS: 通用类型系统(Common Type System)

CLS: 公共语言定义(Common Language Specification)

CLR: 公共语言运行时(common language runtime)

35. 值类型和引用类型的区别?

值类型分配在堆栈上(作用域结束时,所占空间自行释放,效率高,无需进行地址转换);引用类型分配在堆上(由GC来控制其回收,需要进行地址转换,效率降低)

36. 如何理解委托?

相当于函数指针,委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

37. UDP 连接和 TCP 连接的异同。

UDP: 只管传,不管数据到不到,无须建立连接

TCP: 保证传输的数据准确,需要连接

38. ASP.net 的身份验证方式有哪些?
windows身份验证: IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问.
Forms验证:用Cookie来保存用户凭证,并将未经身份验证的用户重定向到自定义的登录页.
Passport验证:通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录和核心配置文件服务.

39. 请解释进程与线程的区别?进程与程序的区别 ?

一个程序至少有一个进程,一个进程至少有一个线程

进程是表示资源分配的基本单位,又是调度运行的基本单位,

线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。

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

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

system.web 系统配置

compilation动态调试编译设置

customErrors自定义错误信息设置

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

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

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

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

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

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

43. 请解释转发与跳转的区别?

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

跳转就是指客户端的跳转

44. C #中, string str = null string str = "" 请尽量使用文字或图象说明其中的区别。
string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符窜的内存空间.

45. String strTmp = "abcdefg某某某";

int i = System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j = strTmp.Length;
以上代码执行完后,i =++13++ j = ++10++

46. . C# property attribute 的区别,他们各有什么用处,这种机制的好处在哪里?

一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加 性质

47. 需要实现对一个字符串的处理 , 首先将该字符串首尾的空格去掉 , 如果字符串中间还有连续空格的话 , 仅保留一个空格 , 即允许字符串中间有多个空格 , 但连续的空格数不可超过一个 .
答: string inputStr=" xx xx ";

inputStr=Regex.Replace(inputStr.Trim()," *"," ");

48. String类与StringBuilder类有什么区别?为什么在.Net类库中要同时存在这2个类?(简答)

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

49. final, finally, finalize的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等

50. 叙述const与readonly的区别

const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。

const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全评估。

const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。

readonly在运行期评估赋值,使我们得以在确保"只读访问"的前提下,把object的初始化动作推迟到运行期进行。

readonly 关键字与 const 关键字不同: const 字段只能在该字段的声明中初始化。

readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字段可用于运行时常数。

readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。

相关推荐
a180079310801 小时前
软件工程面试题(二十二)
java·面试·软件工程
uhakadotcom1 小时前
使用 Model Context Protocol (MCP) 构建 GitHub PR 审查服务器
后端·面试·github
uhakadotcom1 小时前
Apache Airflow入门指南:数据管道的强大工具
算法·面试·github
uhakadotcom1 小时前
Ruff:Python 代码分析工具的新选择
后端·面试·github
uhakadotcom1 小时前
Mypy入门:Python静态类型检查工具
后端·面试·github
AI.NET 极客圈2 小时前
AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用
人工智能·.net
源之缘-OFD先行者3 小时前
GMap.NET + WPF:构建高性能 ADS-B 航空器追踪平台
.net·wpf·ads-b
uhakadotcom3 小时前
构建高效自动翻译工作流:技术与实践
后端·面试·github
勘察加熊人3 小时前
forms实现俄罗斯方块
c#
渗透测试老鸟-九青4 小时前
面试经验分享 | 成都渗透测试工程师二面面经分享
服务器·经验分享·安全·web安全·面试·职场和发展·区块链