2020年最新 C# .net 面试题,月薪20K+中高级/架构师必看(七)
151、编写一个带参数,带返回值的自定义事件。
https://blog.csdn.net/weixin_34375054/article/details/86050234
152、多服务器如何生成全局唯一ID?
UUID、通过MySQL的auto-increment自增字段
153、简述socket通信建立和断开链接的过程。
https://www.cnblogs.com/felixzh/p/8359066.html
154、Javascript是否存在面向对象概念中的类?如果存在,如何定义?
function Person(name) { this.name = name; alert(this.name); } Person.prototype.getName = function () { return this.name; } function Test() { var Li = new Person("刘宇"); alert(Li.getName()); } var pTest = Test; pTest();
155、在前端开发中,SPA代表什么意思?实现SPA的有哪些框架?用过哪些方式来优化页面组件
https://blog.csdn.net/weixin_45021098/article/details/106491869
156、如何解决.net中的内存泄漏问题?用到过哪些检测工具?
.NET内存泄漏,更准确的说应该是对象超过生命周期而不能被GC回收。
常见的内存泄露有:
a、静态引用;b、控件不使用后未销毁;c、调用非托管资源而未释放;d、事件注册后未解除注册,等。
解决方案:
(1) Dispose的使用
如果使用的对象提供Dispose方法,那么当你使用完毕或在必要的地方(比如Exception)调用该方法,
特别是对非托管对象,一定要加以调 用,以达到防止泄露的目的。
(2) using的使用
using除了引用Dll的功用外,还可以限制对象的适用范围,当超出这个界限后对象自动释放,比如 using语句的用途定义一个范围,将在此范围之外释放一个或多个对象。
(3) 事件的卸载
这个不是必须的,推荐这样做。之前注册了的事件,关闭画面时应该手动注销,有利于GC回收资源。
(4) API的调用
一般的使用API了就意味着使用了非托管资源,需要根据情况手动释放所占资源,特别是在处理大对象时。
4.5继承 IDisposable实现自己内存释放接口 Net 如何继承IDisposable接口,实现自己的Dispose函数
(5)弱引用(WeakReference )
通常情况下,一个实例如果被其他实例引用了,那么他就不会被GC回收,而弱引用的意思是,如果一个实例没有被其他实例引用(真实引用),
而仅仅是被弱引 用,那么他就会被GC回收。
诊断工具:
a、大多使用windows自带的perfmon.msc,
b、用过的工具里面CLRProfiler 和dotTrace还行,windbg也还行。
不过坦白的说,准确定位比较费劲,最好还是按常规的该Dispose的加Dispose,也可以加 GC.Collect
157、列出你所了解的设计模式,并用代码写出一个例子。说一说使用设计模式可能带来的好处。
158、在设计一个自定义类型时应如何选择使用Value Type还是Reference Type?
小数据量用值类型,大数据量用引用类型。
需要动态增加的用引用类型。
159、Debug Build和Release Build有什么区别?在执行效率上有什么明显的区别么?
Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略
160、特性能够放到某个方法的参数上?如果可以,这有什么用?
可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。
对方法的参数设置Attribute的例子
[AttributeUsage(AttributeTargets.Parameter)]
public class ParameterAtt : Attribute
{
public int Min = 100;
}
public class AttributeTest
{
public void TestMethod([ParameterAtt(Min = 100)] int par1)
{
ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];
ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt;
if (att.Min > par1)
{
throw new Exception("要求para1最小为" + att.Min);
}
}
}
161、请解释一下IClonable
IClonable 方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实 例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().
162、.NET中如何实现深拷贝(deep copy)?
实现IClonable接口
1)NET中为什么不提供默认的deep copy?
163、Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?
Debug.Write是调试的时候向跟踪窗口输出信息。
当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。
164、有什么办法可以与现有unmanaged code集成?在集成的时候应该考虑什么问题?
https://www.cnblogs.com/Scimanity/p/zhegezenmeyong.html
165、跨防火墙的 DCOM必须打开哪个端口?端口135是用来做什么的?
135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,有关内容我在http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html 有过一些描述。
135是远程过程调用(RPC)的默认端口
166、一个进程可以访问的Windows地址空间有多大?等于系统的虚拟内存大小么?这两方面将对系统的设计产生什么样的影响?
Windows使用一个系统:虚拟寻址系统。该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全有Windows后台管理,其实际结果是32位处理器上的每个进程都可以使用4GB的内存------无论计算机上有多少硬盘空间(在64位处理器上这个数值会更大)。
这个4GB内存实际上包含了程序的所有部分------包括可执行代码,代码加载的所有dll,以及程序运行时使用的所有变量的内容。
这个4GB内存称为虚拟地址空间,或虚拟内存。
167、使用yield语句返回[0,100]中的完全平方数。
168、数据库的三大范式是什么?
https://www.cnblogs.com/zoro-zero/p/13501079.html
169、post、get的区别,百度搜索是用的get还是post?
170、编写一个判断邮箱的正则表达式?
171、windows中cmd的常用命令?
172、Linux操作系统的常用命令?
173、List<T>和T[]的区别?
174、数据库中的内连接和外连接是干嘛的,使用方式?
175、Lambda表达式?