• NET牛人应该知道些什么? (本答复不是标准答案,敬请兄弟们补充更正,不胜感激)


     


    任何一个使用.NET的人

    1) 描述线程与进程的区别?

    线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据空间。用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。

    2) 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同

    Windows服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,想比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用 。自动方式的时候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户,这在对系统资源访问的时候特别需要注意。

    3)  Windows单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?

    这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的最大内存量为:232 /2 = 2G 。单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。

    4)  什么是强类型,什么是弱类型?哪种更好些?为什么?

    强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等

    5)  PID是什么?在做系统的故障排除时如何使用它?

    PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.net等ide将故障进程附加到进程中进行调试(debug)

    6)  单个TCP/IP端口上能够被多少个进程侦听?

    可以为多个,多个为端口复用 (多谢蛙蛙池塘的提醒)
    看下面代码

    端口复用
    Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket1.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),8235));
                socket1.Listen(10);
                socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                socket2.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8235));
                socket2.Listen(10);
                Console.Read();

    7)  什么是GAC?它解决了什么问题?

    Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。

    中级.NET开发人员

    1)  阐述面向接口、面向对象、面向方面编程的区别

    面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是依赖倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。

    2)  什么是Interface?它与Abstract Class有什么区别?

    接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类

    3)  什么是反射?

    程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例

    4)  使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?

    Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service

    5)  类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?

    不清楚

    6)  从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?

    这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生

    7)  调用Assembly.Load算静态引用还是动态引用?

    动态

    8)  何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?

    呵呵,这个比较有意思,相比LoadFile,LoadFrom则显得不地道,因为它娶媳妇的时候,是让人家穿上嫁妆,坐上马车,还得带着人家的妹妹来,:)用它加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来。而LoadFile就地道的多,它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行。

    9)  什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?

    它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。

    10) Assembly.Load("foo.dll"); 这句话是否正确?

    错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll"); (多谢 Tristan(Guozhijian)的提示更正)

    11) 做强签名的assembly与不做强签名的assembly有什么不同?

    强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC中,而不做强签名的确不能。

    12)  DateTime是否可以为null?

    不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null

    13)  什么叫JIT?什么是NGEN?它们分别有什么限制和好处?

    Just In Time 及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异。

    14)  Finalize()和Dispose()之间的区别?

    Finalize()用于隐式释放资源,Dispose()用于显示释放资源 (Finalize()的确相当于C++中的析构函数(多谢Jeffrey Zhao提示更正)

    15)  using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的

    有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结

    16)  tasklist /m "mscor*" 这句命令是干嘛的

    列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息

    17)  in-proc和out-of-proc的区别

    in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。

    18)  .NET里的哪一项技术能够实现out-of-proc通讯?

    .Net Remoting技术或者WCF技术

    19) ASP.NET在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?

    Xp : aspnet_Wp.exe
    Windows 2000 : aspnet_Wp.exe (多谢 Tristan提示更正)
    Windows 2003 : w3wp.exe

    高级开发人员/架构师


    1) DateTime.Parse(myString); 这行代码有什么问题?

    有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse() ,同时,还需要注意到文化区域的设置,如果做代码规范检查,该语句也会不符合规范,就是因为缺少文化区域的设置

    2) PDB是什么东西? 在调试中它应该放在哪里?

    PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。 默认的是同一目录,ide还可以设置全局pdb symbol文件的地址,这也是vs2008能调试.net framework source code的方法。还可以为解决方案指定pdb位置

    3) 什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?

    不知道,望指教 ?

    4) 写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查"

    lock双重检查
    private static object instrace;
    static object lockedObj = new object();
    public static void LockTest()
    {         
    if (instrace == null)
    {
    lock (lockedObj)
    {
    if (instance == null)
    {
                            instance = new object();
                        }
                    }
                }
            }

    5) 什么叫FullTrust?放入GAC的assembly是否是FullTrust的?

    FullTrust完全信任。放入GAC中的Assembly是否FullTrust我的理解不是。我理解FullTrust是可以通过代码设定的

    6) 代码加上需要安全权限的特性有什么好处?

    可以更加灵活的设置对代码的访问权限,实现代码级保护。?这点不是特清楚,有明白的给讲解下

    7) gacutil /l | find /i "Corillian" 这句命令的作用是什么?

    全局程序集缓存中如果有Corillian就更新该程序集,没有就安装

    8) sn -t foo.dll 这句命令是干嘛的?

    显示程序集foo.dll的公钥标记

    9) DCOM需要防火墙打开哪些端口?端口135是干嘛用的?

    135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,有关内容我在http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html 有过一些描述。135是远程过程调用(RPC)的默认端口

    10)对比OOP和SOA,它们的目的分别是什么?

    我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而SOA是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。

    11)  XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?

    我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

    12)为什么不提倡catch(Exception)?

    原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等

    13)Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?

    Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

    14)Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。

    Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

    15)JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?

    方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么

    16)对比抽象基类和接口的使用

    抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。

    17)a.Equals(b)和a == b一样吗?

    不一样。多数情况下,a.Equals(b)表示a与b一致, a==b表示a与b的值相等 。也可以有具体重载(多谢Jeffrey Zhao 的指正)

    18)在对象比较中,对象一致和对象相等分别是指什么?

    对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同

    19)在.NET中如何实现深拷贝(deep copy)?

    实现IClonable接口

    20)请解释一下IClonable

    IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().

    深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较
    public class Name
    {
    public string FirstName;
    public string LastName;
        }
    public class Person:ICloneable
    {
    public Name PersonName;
    public string Email;
    /**//// <summary>
    /// Deep Copy的例子
    /// </summary>
    /// <returns></returns>
    public Object Clone()
    {
                Person p = new Person();
                p.Email = this.Email;
                p.PersonName = new Name();
                p.PersonName.FirstName = this.PersonName.FirstName;
                p.PersonName.LastName = this.PersonName.LastName;
    return p;
            }

    public void ChangLastName(string lastName)
    {
    this.PersonName.LastName = lastName;
            }

    public static void Main()
    {
                Person p = new Person();
                p.PersonName = new Name();
                p.PersonName.LastName = "jill";
                p.PersonName.FirstName = "zhang";
                p.Email = "jillzhang@126.com";
                Person sameNamePerson = p.Clone() as Person;
                sameNamePerson.ChangLastName("clr_");
                Console.WriteLine(p.PersonName.LastName);
                Console.WriteLine(sameNamePerson.PersonName.LastName);           


                Person samePerson = p.MemberwiseClone() as Person;
                samePerson.ChangLastName("Shadow");

                Console.WriteLine(p.PersonName.LastName);
                Console.WriteLine(sameNamePerson.PersonName.LastName);

                Console.Read();
            }
        }

    21)什么叫装箱?

    装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱

    22)string是值类型还是引用类型?

    引用类型

    23)XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?

    只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。

    24)为什么不应该在.NET中使用out参数?它究竟好不好?

    我挺喜欢用out参数的,特别是当函数需要有多于1个返回的时候,我比较愿意用out,至于它好不好没研究过 ?

    25)特性能够放到某个方法的参数上?如果可以,这有什么用?

    可以,作用可以对参数有进一步限定,比如输入参数为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);
                }
            }
        }

    联盟快卖 商人,生意人,待创业人士在此可以共赢互利 期待你的加入 群号:140809277
  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/yexinw/p/2169856.html
Copyright © 2020-2023  润新知