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 }
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 }
3、c#索引
索引可以是字符串类型的,可以允许有多个索引参数,下面的方法我就可以定义多个参数。常见的Dictory<string,string>也是索引的一种。在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 }
4、装箱和拆箱
值类型和引用类型之间的转换。频繁装箱和拆箱会导致系统性能降低,可考虑用泛型。值类型赋值给object为装箱操作,值类型赋值给object拆箱(显示转换)。装什么类型拆箱就是什么类型,除非C#中convert.toInt32 等内置的这些方法可以强制拆箱。
5、泛型
考得不多,但我们平常用的比较多。所以对泛型的一些东西需要了解,如泛型约束等。
泛型约束 public void GetEntity<T>() 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通用数据类型
7、托管资源和非托管资源
问题:1、定义 2、如何释放
托管资源是指由CLR管理分配和释放的资源。托管资源有GC释放,非托管资源由程序员自己释放,可以实现dispose接口。
关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。
非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。
值类型在栈内存中,方法结束自动释放,引用类型在堆内存中需要GC来回收
~MyClass() { // Perform some cleanup operations here. } 该代码隐式翻译为下面的代码。 protected override void Finalize() { try { // Perform some cleanup operations here. } finally { base.Finalize(); } }
在一个包含非托管资源的类中,关于资源释放的标准做法是:
(1) 继承IDisposable接口;
(2) 实现Dispose()方法,在其中释放托管资源和非托管资源,并将对象本身从垃圾回收器中移除(垃圾回收器不在回收此资源);
(3) 实现类析构函数,在其中释放非托管资源。
1 PublicclassBaseResource:IDisposable 2 { 3 PrivateIntPtr handle; // 句柄,属于非托管资源 4 PrivateComponet comp; // 组件,托管资源 5 Privateboo isDisposed = false;// 是否已释放资源的标志 6 PublicBaseResource() 7 { 8 } 9 //实现接口方法 10 //由类的使用者,在外部显示调用,释放类资源 11 Publicvoid Dispose() 12 { 13 Dispose(true);// 释放托管和非托管资源 14 //将对象从垃圾回收器链表中移除, 15 // 从而在垃圾回收器工作时,只释放托管资源,而不执行此对象的析构函 16 数 17 GC.SuppressFinalize(this); 18 } 19 //由垃圾回收器调用,释放非托管资源 20 ~BaseResource() 21 { 22 Dispose(false);// 释放非托管资源 23 } 24 //参数为true表示释放所有资源,只能由使用者调用 25 //参数为false表示释放非托管资源,只能由垃圾回收器自动调用 26 //如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管 27 资源的释放 28 //但是要记住,重载此函数必须保证调用基类的版本,以保证基类的资源 29 正常释放 30 Protected virtual void Dispose(booldisposing) 31 { 32 If(!this.disposed)// 如果资源未释放 这个判断主要用了防止对象被多 33 次 34 释放 35 { 36 If(disposing) 37 { 38 Comp.Dispose();// 释放托管资源 39 } 40 closeHandle(handle);// 释放非托管资源 41 handle= IntPtr.Zero; 42 } 43 this.disposed=true;// 标识此对象已释放 44 } 45 }
8、MVC原理
路由机制,我觉得此题,根据自己的理解回答即可,可深入回答 从view上请求到controller组织model,反映到view上.详细框架原理,可以查看:https://blog.csdn.net/jehuyang/article/details/100575686
9、MVC中,后台向前台页面传对象的方式
强类型的模型绑定、ViewData、ViewBag 。其中ViewData是ViewDataDictory类型,而VieBag是dynamic类型. dynamic 可以动态给不同的类型。例如:dynamic p1=new Expandobject(); p1.Age=10; p1.Age="222";这样也不会报错。
10、MVC中过滤器
Filter过滤器.AOP 面向切面编程。
IAuthorizationFilter 一般检查用户是否有Action执行权限。在每个Action之前执行OnAuthorization方法。
IActionFilter在每个Action之前执行OnActionExcuting方法,在每个Action执行完成后执行OnActionExecuted 方法. IAuthorizationFilter在IActionFilter执行之前执行,所以检查权限一般写在IAuthorizationFilter中的OnAuthorization方法中。
IResultFilter在每个ActionResult的前后执行,一般很少用
IExceptionFilter当每个Action有未处理的异常执行OnException 方法。MVC中可以使用Application_Error,但建议使用IExceptionFilter方法。
定义的类可以在Global中Global.Filters.Filter.Add(new XXXFilter())添加使用。