C#经典问题总结一
No. 1 C#是托管语言,那么是不是说明使用C#,就能保证不会出现内存泄露以及其他资源的泄漏?如果不是,那么在哪些情况下可能出现泄漏?
答案:C#不能保证没有资源泄漏。比如如下几种情况可能会造成资源泄漏:(1) 调用Native code,比如用P/Invoke或者调用COM;(2) 读写文件时的,没有及时close stream, 或者ADO.NET连数据库时,没有及时关闭连接,也算资源泄漏?(3)注册事件后没有remove,导致publisher和subscriber的强依 赖,垃圾回收可能会被推迟;(4).NET还定义了一些方法直接申请非托管内存,比如Marshal.AllocHGlobal和Marshal.AllocCoTaskMem。通过这种方式得到的内存,如果没有及时释放,也会造成内存泄露。
No. 2 下面的两段C#有哪些不同?

1 static void CatchException1()
2 {
3 try{
4 Function();
5 }
6 catch{
7 throw;
8 }
9 }
10 static void CatchException2()
11 {
12 try{
13 Function();
14 }
15 catch (Exception e){
16 throw e;
17 }
18 }
2 {
3 try{
4 Function();
5 }
6 catch{
7 throw;
8 }
9 }
10 static void CatchException2()
11 {
12 try{
13 Function();
14 }
15 catch (Exception e){
16 throw e;
17 }
18 }
答案:两个函数的catch都是重新抛出截获的exception,但抛出的exception的call stack是不一样的。对于第一种方法,exception的call stack是从最开始的抛出地点开始的。对于第二种方法,exception的call stack是从CatchException2开始的,最初抛出的地方相关的信息被隐藏了。
No.3:运行下面的C#代码,打印出来的结果是什么?

1 struct Person
2 {
3 public string Name;
4 public override string ToString()
5 {
6 return Name;
7 }
8 }
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 ArrayList array = new ArrayList();
14 Person isaac = new Person() { Name = "isaac" };
15 array.Add(isaac);
16 Person first = (Person)array[0];
17 first.Name = "zhang";
18 Console.WriteLine(array[0].ToString());
19 }
20 }
2 {
3 public string Name;
4 public override string ToString()
5 {
6 return Name;
7 }
8 }
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 ArrayList array = new ArrayList();
14 Person isaac = new Person() { Name = "isaac" };
15 array.Add(isaac);
16 Person first = (Person)array[0];
17 first.Name = "zhang";
18 Console.WriteLine(array[0].ToString());
19 }
20 }
答案:Person的定义是一个struct,因此是一个值类型。在运行到语句Person first = (Person)array[0]的时候,first是array[0]的一个拷贝,first和array[0]不是一个实例。因此修改first对array[0]没有影响。
在编程的道路上,一往无前,埋头狂奔。
[奔跑的人生] | [segmentfault] | [spring4all] | [csdn] | [掘金] | [OSChina] | [简书] | [知乎] | [51CTO]
[奔跑的人生] | [segmentfault] | [spring4all] | [csdn] | [掘金] | [OSChina] | [简书] | [知乎] | [51CTO]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2010-12-29 《2010年年度总结》