C# 常见面试问题汇总

2021-01-30 07:12

阅读:508

标签:func   user   需要   HERE   master   简化   -668   return   play   

1、c#垃圾回收机制

    从以下方面入手展开:  1、压缩合并算法   2、代的机制  3、GC调用终结器 Garbage Collector

   . NET采用了和Java类似的方法由CLR(Common Language Runtime)来管理 

     .NET的GC机制有这样两个问题:

  首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。

  第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。

  GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。

       具体详见:https://www.cnblogs.com/nele/p/5673215.html

2、委托和事件

     先说它的定义:委托的本质是类,类型安全的指针,然后从用途上考虑,事件是包装的委托,但事件不是委托。事件是由一个私有委托和add、remove 方法组成。

     事件、索引器、属性本质都是方法。接口只可以定义方法。所以接口也可以定义“事件、索引器、属性”,因为他们的本质也是add、remove 方法。

     委托是一种可以指向方法的数据类型,可以声明委托类型变量。

     声明委托的方式:delegate返回值类型   委托类型名(参数)

     比如delegate void MyDel(int n) 。C#中默认写了2中委托Action,Func,Action基本上都是void没有返回值,Func是有返回值的

    

技术图片技术图片
 1 using System.Collections.Generic;
 2 using System.Linq;
 3 using System.Text;
 4 using System.Threading.Tasks;
 5 
 6 namespace TestConsole
 7 {
 8     delegate void MyDel();
 9     class Program
10     {
11 
12         static void Main(string[] args)
13         {
14             person p = new person();
15             p.QingZhu += ShowMsg;
16             p.age = 24;
17             Console.ReadKey();
18         }
19         static void ShowMsg()
20         {
21             Console.WriteLine("今年是你的本命年!恭喜你");
22         }
23     }
24     class person
25     {
26         private int Age;
27         public int age
28         {
29             get
30             {
31                 return age;
32             }
33             set
34             {
35                 if (value % 12 == 0)
36                 {
37                     if (QingZhu != null)
38                     {
39                         QingZhu();//执行事件
40                     }
41                 }
42             }
43         }
44         public event MyDel  QingZhu;
45     }
46 }
View Code

 

技术图片技术图片
 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace TestConsole
 9 {
10     delegate void MyDel();
11     class Program
12     {
13 
14         static void Main(string[] args)
15         {
16             person p = new person();
17             p.qingzhu += ShowMsg;
18             p.age = 24;
19             Console.ReadKey();
20         }
21         static void ShowMsg()
22         {
23             Console.WriteLine("今年是你的本命年!恭喜你");
24         }
25     }
26     class person
27     {
28         private int Age;
29         public int age
30         {
31             get
32             {
33                 return age;
34             }
35             set
36             {
37                 if (value % 12 == 0)
38                 {
39                     if (this.QingZhu != null)
40                     {
41                         this.QingZhu();//执行事件
42                     }
43                 }
44             }
45         }
46         private  MyDel  QingZhu;
47         public event MyDel qingzhu
48         {
49             add
50             {
51                 this.QingZhu += value;
52             }
53             remove
54             {
55                 this.QingZhu -= value;
56             }
57         }
58 
59     }
60 }
View Code

3、c#索引

    索引可以是字符串类型的,可以允许有多个索引参数,下面的方法我就可以定义多个参数。常见的Dictory也是索引的一种。在IL中本质其实是Get_Item 方法(无参数)、Set_Item 方法(参数:value)。

技术图片技术图片
 1 class MyIntIndex
 2     {
 3         private static string[] name = { "dandan", "chizi", "jianguo" };
 4         public string this[int index]
 5         {
 6             get
 7             {
 8                 string n = name[index];
 9                 return n;
10             }
11             set
12             {
13                 name[index] = value;
14             }
15         }
16     }
17 }
View Code

4、装箱和拆箱

    值类型和引用类型之间的转换。频繁装箱和拆箱会导致系统性能降低,可考虑用泛型。值类型赋值给object为装箱操作,值类型赋值给object拆箱(显示转换)。装什么类型拆箱就是什么类型,除非C#中convert.toInt32 等内置的这些方法可以强制拆箱。

5、泛型

   考得不多,但我们平常用的比较多。所以对泛型的一些东西需要了解,如泛型约束等。 

   泛型约束 public void GetEntity() where T:class

    where T :struct //约束T必须为值类型
    where K : class //约束K必须为引用类型
    where V : IComparable //约束V必须是实现了IComparable接口
    where W : K //要求W必须是K类型,或者K类型的子类
    where X :class ,new () // 或者写出 new class() ;   X必须是引用类型,并且要有一个无参的构造函数(对于一个类型有多有约束,中间用逗号隔开)

6、c#如何调用c++ 的dll?为什么可以调用

     右击添加类中的“TypeLib中的MFC类”选项实现跨平台调用。添加好后会生成h文件和cpp文件

   技术图片技术图片技术图片

   填写完后Function.h文件会报错,错误类型如下。这里需要在C++项目里面设置,让动态库受到公共语言运行时的支持。如下图所示:打开项目属性

   技术图片技术图片技术图片

     C#和C++在vs中的语法类型都会编译成CTS(Common Type System通用数据类型)生成.net 中有CLS(Common Language Specification公共语言允规范) 并在IL代码中的CLR(Common Language Runtime 公共语言运行池)中运行。

     Int和Int32,string与String的区别,一个是C#代码中的类型,一个是IL中的CTS通用数据类型

C# 常见面试问题汇总

标签:func   user   需要   HERE   master   简化   -668   return   play   

原文地址:https://www.cnblogs.com/whitebai/p/11668972.html


评论


亲,登录后才可以留言!