作者: admin

  • DotNet程序员面试问题评估

    欢迎各位Dotnet程序员回答。不需要回答出具体问题,只要标记大致程度即可。
    1什么是DotNet的CLR? CLR作用是什么?

    A不知道     B知道很少    C知道一些    D非常了解

     

    2 DotNet中如何使用Win32的DLL?(没有reference可以添加)

    A不知道     B知道很少    C知道一些    D非常了解

     

    3 C#使用什么关键字实现可变个数参数(variable number parameters)?

    A不知道     B知道很少    C知道一些    D非常了解

     

    4 C#中的weak reference是什么?用于什么场合?

    A不知道    B知道很少    C知道一些    D非常了解

     

    5 C#中的using dispose模式是什么?用于什么场合?

    A不知道     B知道很少    C知道一些    D非常了解

     

    6 C#中Garbage Collection是什么?简介GC的internal工作方式(如果你是微软开发人员,如何实现GC)?

    A不知道     B知道很少    C知道一些    D非常了解

     

    7 C#中的关键字as, yield, out/ref, virtual/abstract/override?

    A不知道    B知道很少    C知道一些    D非常了解

     

    8 Strong name signature是什么?有什么用?

    A不知道     B知道很少    C知道一些    D非常了解

     

    9 字符串intern暂留机制是怎么一回事?

    A不知道     B知道很少    C知道一些    D非常了解

     

    10 Windows平台下多进程通讯方式?越多越好

    A不知道     B知道很少    C知道一些    D非常了解

     

    11 Delegate, Event, Action, Func都是什么?

    A不知道    B知道很少    C知道一些    D非常了解

     

    12 MVC, MVP, MVVM设计模式?

    A不知道     B知道很少    C知道一些    D非常了解

     

    13 除了工厂模式和单例模式,列举并且简单介绍你知道的设计模式以及应用场合?

    A不知道     B知道很少    C知道一些    D非常了解

     

    14 C#中overload和override如何实现?

    A不知道     B知道很少    C知道一些    D非常了解

     

    15 接口和抽象类有什么区别?都应用在什么场合?

    A不知道     B知道很少    C知道一些    D非常了解

     

    16 LINQ是什么?写一个简单的LINQ语句?

    A不知道     B知道很少    C知道一些    D非常了解

     

    17 C# Lambda是什么?写一个简单的lambda?

    A不知道     B知道很少    C知道一些    D非常了解

     

    18 C#中class与struct区别?

    A不知道     B知道很少    C知道一些    D非常了解

     

    19 是否听说过或者了解MEF, Unity, Prism?

    A不知道     B知道很少    C知道一些    D非常了解

     

    20 面向对象设计思想/原则有哪些?(SOLID)

    A不知道     B知道很少    C知道一些    D非常了解

     

    21 如何实现一个plugin插件可扩展系统?

    A不知道     B知道很少    C知道一些    D非常了解

     

    22 DotNet中的LinkedList与SortedList有什么不同?内部如何实现?

    A不知道     B知道很少    C知道一些    D非常了解

     

    23 设计一个字符串类(不能使用类库中的string class)?简要说明关键方法

    A不知道     B知道很少    C知道一些    D非常了解

     

     

  • 大连InfoQ活动QClub记事-35岁程序员这个坎如何进行职业规划

    2011年的7月23日必定会成为一个令人难忘的日子,因为这一天发生了太多神奇的新闻。不过这里想说的是大连IT从业者、程序员的一次聚会,是由InfoQ组织的QClub。

    (下文中提到的推,是指的twitter,而微博指的是新浪微博)

    大概一两个月之前,有人在微博上提醒我,@侯伯薇 会组织一次大连的QClub活动。这个事让我感觉很兴奋、很开心。

    作为程序员,会经常被人搭上各种各样固定的tag,比如“宅”,比如“闷”、“无聊”,“不会沟通”,“害羞”,“冷笑话”等等。QClub不能说是宅男们的反击,而应该说是程序员期待与人面对面沟通交流的那种感觉。在这个时候,一个名字、一个ID会变得更鲜活生动,更加有生命力。

    早上起来发现天气极为恶劣,@gamtin在推上说,也许又要像去年Python用户组那次(大连Python用户组活动简记)的天了,好在接近中午的时候雨渐渐小了,而且天气也开始放晴。侯伯薇在微博上发消息说,他已经出发去会场准备了。

    我也提前一小时出发,到的时候大概是一点左右(定的是一点半开始),屋子里还没有几个人,前面有两三个人在准备电脑神马的,由于去的早,InfoQ的海报也还没有放在会议室外面,我是好一顿撒磨(大连话,意为探头探脑的看)才敢进去,吼吼。

    过了十几分钟,侯伯薇与欧兰辉 @ouland 一起到了,侯伯薇看上去比网上感觉的要年轻,这也是搞技术的最大好处啊!!我们简单交谈了几句,提到了这次InfoQ对于大连程序员以及搞IT方面的朋友,真是极为难得。侯伯薇提到了百年人寿对本次活动提供赞助。

    IMG_20110723_141051这次QClub主要是三个议题,由于是架构专场,演讲议题都与架构有关系。首先是时代麦微(follow5)的CTO张爽介绍了follow5这个微博平台的架构。个人感觉由于不是太了解听众群兴趣、层次,张爽的presentation偏向于普及,我比较感兴趣的问题涉及的不多,也许是不方便,具体的数据也不多(比如具体架构选型,神马Linux用了神马开源项目,数据流量多少,哪个微博同步量更多,基于用户微博是否有二次数据挖掘的想法,如何盈利,下一步计划等等)由于我也是一个Open话题的主持人,所以就没法分身与张爽进行讨论。其实大言不惭的说一下,我对另外两个讨论话题或多或少都有涉及,比如微博同步,我有写过一个twitter同步到新浪、腾讯微博的小程序,用了GAE;再比如NodeJS,那件让人羞射的T恤就是我研究写文章得来的哦。

     

    第二个话题是侯伯薇主讲的“选择合适的架构”。其中我觉得很关键很同意的观点就是,架构本身不是一成不变的,要根据具体的情况来做平衡(trade off)抉择,架构师之所以值钱,不是因为他们知道架构如何如何,而是他们知道在某种情况下应该选择什么架构、不应该选择什么架构技术,而且能够用代码把这种技术的可能性show出来。

     

    第三个议题我这里也有参与,准备的话题是“35岁程序员这个坎,如何进行职业规划职业发展”,没想到参与的人也不少。欧兰辉在开始帮我撑了一会场子(后来这家伙跑到别的讨论组去了)。为什么要选这个话题?其实大家搜索一下各种招聘网站或者是各种博客就能发现“35岁为程序员应聘上限”“35岁以后不写程序,要搞管理”“35岁以后的程序员没有前途”之类的言论比比皆是。35岁以后就必须转型?不能搞技术?不是做管理就不行了?这次讨论组就想跟其他朋友一起探讨一下这个问题。

    首先让大家做了一个简单的自我介绍,发现做了几年、接近35的开发者还不少,也有刚毕业入职的学生对前途比较迷茫,还有人对程序员这个职业很迷惑不知道该如何走,另外也有人关注程序员这个群体的健康问题。关注的点都非常有价值,我把问题记在便签上,后面慢慢讨论。

    要说明的是,我提到的35岁程序员,指的是在这个年龄段可能是Senior Developer,可能是Leader或Manager,也可能是架构师,也可能是业余的移动App开发者;这里说的程序员,指的是35岁以及35岁以后还有兴趣继续编程,而且在工作中也能够继续编程,而且以编程为乐趣的IT从业者。如果把程序员局限在某个头衔下,天天看着式样书敲程序的码工(coding worker)那我也不同意35岁的时候还是这样。

    在讨论中我提出一个观点,在总结的时候也是这样说的,就是程序员这个职业,在中国现阶段,赚钱方面比其他行业可能还要差一些,如果坚持做技术可能会有类似的问题。很多人选择程序员作为职业,是因为自己喜欢编程,喜欢编程中能控制一切的感觉,喜欢与电脑打交道的直接(而不是管理团队要考虑的麻烦事),或者说,编程就是一种业余爱好。如果觉得大连程序员收入低,可以试试北上广,或者试试肉身翻墙,学英文学日文的翻墙出去有啥用?我们这样搞技术的技术移民那就相对容易多了。另外也可以试试与志同道合的朋友一起搞搞App开发,虽然说现在不是那种一个人包打天下的时代,但是两三个高手做出一个应用程序,也不是不可能。最重要的还是要经营自己的品牌,把自己在这个圈子里变得知名,把技术功底打得扎扎实实,这样才有比较好的前途有比较多的选择方向。

    有些朋友选择程序员,是因为就学的这个专业,也找不到别的好工作(类似工资水平下)。这时候我的建议是,在30岁之前考虑你的转型问题,30岁左右开始做转型。程序员在现阶段的中国,只能算是一个中等甚至中等偏下的行业,它的长久发展可持续性在中国体现的非常不够(在日美这些地方就不一样了)。所以说,但你仅仅为了养家糊口而选择成为程序员,要么早点考虑转行,要么早点出国多赚钱镀金。

    大家讨论了一个多小时,在5点多的时候各位主持人做了总结发言。然后会议结束。

    这次QClub可以说是一个胜利的大会,一次奋发向上的大会,一次令人斗志昂扬的大会,一次红旗飘飘的大会。。。。。。

  • String s = new String("xyz");创建了多少个String实例?

    在”传智播客DotNet面试宝典(改).pdf“有这样一道非常有意思,也比较有深度的题目。

    String s = new String(“xyz”);创建了多少个String实例?

    传智的老师告诉同学们:答案是两个,一个是”xyz”,一个是指向”xyz”的引用对象。

    貌似很正确,很有道理。没错,”xyz”是一个字符串,而DotNet字符串(其实Java也是)有驻留intern这样一种机制。

     

    抱歉的是,传智的老师没有料到,问这个问题的同学或者是公司太坏了。这道题的题目是错的,答案也不对。

    大家手头有visualstudio的可以建立一个console程序试试看,能不能编译通过?!

    至于答案为什么也不对,看看这篇非常详细的解释吧,虽然作者解释的是针对Java语言。

    http://www.iteye.com/topic/774673

    为什么Java能这样写?因为Java有这种构造函数String(String original)而DotNet中的String类没有。

    稍微修改让它能够编译

            static void Main(string[] args)         {             char[] chars = { 'w', 'o', 'r', 'd' };             String s2 = new String(chars);             String s3 = new String(chars);             int i = s2.Length;             int j = s3.Length;             Console.WriteLine(i + j);         }

    如果我们用ILSpy看,结果如下,注意,其中只调用了两次newobj,分别是针对s2和s3。

     

    .method private hidebysig static
    void Main (
    string[] args
        ) cil managed
    {
    // Method begins at RVA 0x2058
    // Code size 57 (0x39)
    .maxstack 3
    .entrypoint
    .locals init (
            [0] char[] chars,
            [1] string s2,
            [2] string s3,
            [3] int32 i,
            [4] int32 j
        )
        IL_0000: ldc.i4.4
        IL_0001: newarr [mscorlib]System.Char
        IL_0006: dup
        IL_0007: ldtoken field int64 ‘<PrivateImplementationDetails>{06FAE1C3-0E45-4AE7-A401-B8A7D1EFF5D6}’::’$$method0x6000001-1′
        IL_000c: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle)
        IL_0011: stloc.0

        IL_0012: ldloc.0
        IL_0013: newobj instance void [mscorlib]System.String::.ctor(char[])
        IL_0018: stloc.1

        IL_0019: ldloc.0
        IL_001a: newobj instance void [mscorlib]System.String::.ctor(char[])
        IL_001f: stloc.2

        IL_0020: ldloc.1
        IL_0021: callvirt instance int32 [mscorlib]System.String::get_Length()
        IL_0026: stloc.3

        IL_0027: ldloc.2
        IL_0028: callvirt instance int32 [mscorlib]System.String::get_Length()
        IL_002d: stloc.s j

        IL_002f: ldloc.3
        IL_0030: ldloc.s j
        IL_0032: add
        IL_0033: call void [mscorlib]System.Console::WriteLine(int32)
        IL_0038: ret
    } // end of method Program::Main

  • 大连对日外包程序员如何提高自己基础水平以及一些C#的资料链接

    我在推上发了一些牢骚,有些朋友来面试,基础不是很扎实,理由是自己一直做对日外包,没有机会提升自己,掌握一些基础内容。

    另外一个理由是公司只用了某某技术,没有用某某技术,只用了2.0,所以我不知道3.5、4.0等等。

    这都不是理由。

    这都不是理由!

     

    这时候我假设自己是一个对日外包企业的程序员,吃完饭后老婆在看电视,我拿起Thinkpad笔记本,登录进著名的MSDN,开始继续自我提升的步骤。

    坚持每天抽出半小时到一小时学习,足够你提升自己的水平!

    这次也不推荐书了,只要能上网,就每天看一段MSDN的文章或者代码。保证能提高自己!

     

    首先要知道自己缺少什么,有一个评估很有意思也很容易评估自己需要提升哪些地方:《程序员能力矩阵》http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm 这里假定我想提升Windows平台上DotNet、CSharp开发。

    这里有一系列链接可以学习,每天一篇或者几天一篇应该没问题。其实比较好的办法是买本书系统学习,但我这里想说的是,资料到处都是,书籍唾手可及。

     

    没用心不努力才是水平差基础薄弱的最大原因!

     

    下面的链接没有什么系统性,如果有一两年经验了,看这些东西问题不大。

    http://msdn.microsoft.com/en-us/library/3bwa4xa9.aspx Using Objects That Encapsulate Resources

    这一篇要着重提一下,很多四五年经验的C#开发者,不知道using关键字的这种用法,怎么说呢,说你不求甚解好呢?还是说你不够努力好呢?

     

    http://msdn.microsoft.com/en-us/library/dd642420.aspx Visual Studio 2010 Visual Basic and Visual C#

    http://msdn.microsoft.com/en-us/library/618ayhy6.aspx C# Reference

    http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx C# Programming Guide

    http://msdn.microsoft.com/en-us/library/dd460655.aspx Programming Concepts

    http://msdn.microsoft.com/en-us/library/w0x726c2.aspx .NET Framework 4

    http://msdn.microsoft.com/en-us/library/w0x726c2%28VS.90%29.aspx .NET Framework 3.5

    http://msdn.microsoft.com/en-us/library/ff921347.aspx EnterpriseLibrary Unity MEF Prism这些概念,至少知道它们是什么

    http://msdn.microsoft.com/zh-cn/magazine/default.aspx MSDN杂志

    http://msdn.microsoft.com/en-us/library/orm-9780596516109-03.aspx C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers

    http://msdn.microsoft.com/en-us/library/orm-9780596527730-01.aspx C# 3.0 Design Patterns: Use the Power of C# 3.0 to Solve Real-World Problems

     

    http://msdn.microsoft.com/en-us/library/k5532s8a.aspx .NET Framework 4 CLR Managed Execution Process

    http://msdn.microsoft.com/en-us/library/f144e03t.aspx Automatic Memory Management (GC)

    http://msdn.microsoft.com/en-us/library/ee787088.aspx Fundamentals of Garbage Collection

    http://msdn.microsoft.com/en-us/library/ms404247.aspx Weak References

    http://msdn.microsoft.com/en-us/library/ms172334.aspx Reflection and Generic Types

    http://msdn.microsoft.com/en-us/library/a4a92379.aspx Accessing Custom Attributes

    http://msdn.microsoft.com/en-us/library/ff519622.aspx Observer Design Pattern Best Practices

    http://msdn.microsoft.com/en-us/library/sd10k43k.aspx Interoperating with Unmanaged Code

    http://msdn.microsoft.com/en-us/library/hyz69czz.aspx Managed Threading Basics

    http://msdn.microsoft.com/en-us/library/ms973850.aspx Microsoft .NET Framework FAQ

    http://msdn.microsoft.com/en-us/library/ms973837.aspx Garbage Collector Basics and Performance Hints

    http://msdn.microsoft.com/en-us/library/bb985748.aspx Displaying Metadata in .NET EXEs with MetaViewer

    http://msdn.microsoft.com/en-us/library/ms973858.aspx Writing High-Performance Managed Applications : A Primer

    http://msdn.microsoft.com/en-us/magazine/cc164086.aspx Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API

    http://msdn.microsoft.com/en-us/library/aa479866.aspx Generics FAQ: .NET Framework

    http://msdn.microsoft.com/en-us/library/aa479858.aspx Generics FAQ: Best Practices

    http://msdn.microsoft.com/en-us/library/aa479859.aspx Generics FAQ: Fundamentals

    http://msdn.microsoft.com/en-us/library/aa302329.aspx Improving String Handling Performance in .NET Framework Applications

    http://msdn.microsoft.com/en-us/library/ms973880.aspx The Microsoft Shared Source CLI Implementation Refresh

    http://msdn.microsoft.com/en-us/library/bb985613.aspx Migrating Native Code to the .NET CLR

    http://msdn.microsoft.com/en-us/magazine/cc164123.aspx Calling Win32 DLLs in C# with P/Invoke

    http://msdn.microsoft.com/en-us/magazine/cc164139.aspx The CLR’s Thread Pool

    http://msdn.microsoft.com/en-us/magazine/cc164094.aspx Introducing Generics in the CLR

    http://msdn.microsoft.com/en-us/library/ms973893.aspx Object Serialization in the .NET Framework

    http://msdn.microsoft.com/en-us/library/ms973872.aspx An Overview of Managed/Unmanaged Code Interoperability

    http://msdn.microsoft.com/en-us/library/ms973838.aspx Performance Considerations for Run-Time Technologies in the .NET Framework

    http://msdn.microsoft.com/en-us/library/ms973839.aspx Performance Tips and Tricks in .NET Applications

    http://msdn.microsoft.com/en-us/library/aa302338.aspx Primary Interop Assemblies (PIAs)

    http://msdn.microsoft.com/en-us/library/bb264782.aspx Profiler Stack Walking in the .NET Framework 2.0: Basics and Beyond

    http://msdn.microsoft.com/en-us/library/aa302324.aspx Using the .NET Framework SDK Interoperability Tools

    http://msdn.microsoft.com/en-us/library/ms973826.aspx Using the ECMA Standards: An Interview with Miguel de Icaza

  • C语言中if (p==NULL)的是与非

    博客园cnblogs不知为何最近开始渐有C语言开发重启的迹象,不少人开始写一些C语言的教程。

    其中看到一段有趣的留言,提到这个写法:if (p == NULL),

    有人说这是不好的~,经典不提倡的~,会写错出问题的~,华为都禁止的~。

     

    我倒是有些不同的看法。

     

    首先这种写法是有问题,一般来讲对于空指针可以这样写

    if ( p )

    或者反义是这样 if ( !p )

    既简单,还节省字数。

     

    如果是想写的比较容易懂,那么if (p == NULL) 是我提倡的方式。

    你可以很简单的读成“如果p等于空值”,反过来的方式NULL==p就有些别扭,不是给人看的。

     

    有人提到p==NULL很容易写成p=NULL,代码出错啦!会有bug啦!

     

    好吧,我承认这是一种可能性,在早期编译器不完善的时候的确如此。那时候还提倡用匈牙利命名法,因为编译器对类型识别支持不好,很容易写出胡乱转型的代码(当然现在的C语言也容易)。但是针对正在使用的编译器以及将来更先进的编译器,在条件判断中使用p==NULL不是问题。

     

    做一个很简单的实验,使用VC2010,项目设置为compile as C,注意关键一点“把warning级别提高到最高级别4”,这时候if (p=NULL )会得到如下警告:

    1>purec.cpp(10): warning C4706: assignment within conditional expression

    很简单吧,不需要你使用那种反人类常识的代码规范。

     

    使用GCC(v4.5.2 in Ubuntu11.4)也很容易,它有一个编译选项-Wall,警告信息如下:

    /home/sun/foobar-sample/main.c:24:2: warning: suggest parentheses around assignment used as truth value

     

    如果工具支持,为何不使用一种更为合乎阅读习惯的方式呢,BTW,我查找了一下经典的K&R,其中==的使用都是我提到的p==0这种方式,其它更为经典的(有么?)我就不知道了。