你是高级程序员?那就来挑战一下!

基础题:

  1. 传入某个属性的set方法的隐含参数的名称是什么?
    value,它的类型和属性所声名的类型相同。
  2. 如何在C#中实现继承?
    在类名后加上一个冒号,再加上基类的名称。
  3. C#支持多重继承么?
    不支持。可以用接口来实现。
  4. 被protected修饰的属性/方法在何处可以访问?
    在继承或间接继承与这个类的子类中可以访问。
  5. 私有成员会被继承么?
    会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
  6. 请描述一下修饰符protected internal
    被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。
  7. C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?
    两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。
  8. C#中所有对象共同的基类是什么?
    System.Object.
  9. 重载和覆写有什么区别?
    重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。
  10. 在方法定义中,virtual有什么含意?
    被virtual修饰的方法可以被子类覆写。
  11. 能够将非静态的方法覆写成静态方法么?
    不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。
  12. 可以覆写私有的虚方法么?
    不可以,如果一个方法是虚方法,就不应该定义成私有的!
  13. 能够阻止某一个类被其他类继承么?
    可以,使用关键字sealed。
  14. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
    可以,标记这个类为public,并标记这个方法为sealed。(注意:这个方法必须是覆盖了父类中的一个虚方法,否则,无法使用sealed)
  15. 什么是抽象类(abstract class)?
    一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。
  16. 何时必须声明一个类为抽象类?
    当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
  17. 接口(interface)是什么?
    只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。
  18. 为什么不能指定接口中方法的修饰符?
    接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。
  19. 可以继承多个接口么?
    当然。
  20. 那么如果这些接口中有重复的方法名称呢?
    这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。
  21. 接口和抽象类的区别是什么?
    接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。
  22. 如何区别重载方法?
    不同的参数类型,不同的参数个数,不同的参数顺序。
  23. const和readonly有什么区别?
    const关键字用来声明编译时常量,readonly用来声明运行时常量。
  24. System.String 和System.StringBuilder有什么区别?
    System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。

高级题:

  1. Thread和Process之间有什么区别?.NET新引入了Application Domain的概念,这样他们三个之间有什么区别?引入了Application Domain会带来一些潜在的问题么?

进程可以理解为一个容器,提供进程空间,线程所使用的内存都在进程空间中分配。每个线程有自己的堆栈。APPDomain相当于一个逻辑概念,相当于在进程中逻辑的划分了一些区域,所以线程是可以跨域访问另外的线程。

  1. Windows Service与普通的EXE在执行过程中有什么区别?

一般前者无界面,有windows的Service服务器负责维护启动和关闭。Exe由用户维护且一般有界面。

  1. 一个进程可以访问的Windows地址空间有多大?等于系统的虚拟内存大小么?这两方面将对系统的设计产生什么样的影响?

a.跟数据总线有关系。一般32位操作系统,寻址空间可以达到4GB,所以一个进程可以访问的地址也为4GB(不过实际上,有2GB是留给操作系统使用的,4M是不可访问的,剩下的空间才供进程使用)。

b.不等于虚拟内存。

c.寻址空间和数据总线的宽度有关系。虚拟内存会消耗CPU处理时间。因为需要做内外存的转换工作。

  1. EXE和DLL之间的区别是什么?在系统设计中应该如何选择使用它们?

a..Exe有自己的进程空间,dll没有,dll只能被引用后,和exe共享进程空间才能被调用和运行(其实还有rundll32命令可以启动dll,该系统命令本质上就是为其提供进程空间)。

b.dll也叫动态链接库,可以将反复使用的共有代码和资源放在动态链接库中,这样在内存中只会有一个副本,节约内存空间(不同的进程根据不同的重定位信息可以定位到制定的dll中)。

  1. 普通的EXE与.NET EXE的执行过程有什么不同?

普通exe可以直接在操作系统上执行,但是.net exe需要jit的及时编译,并在托管环境下(即CLR的控制下)运行

  1. 什么是弱类型,什么是强类型?在系统设计中应该首先考虑使用哪种类型?

弱类型在一定程度上允许不同类型的数据进行相互操作和运算,但是强类型不允许,因为强类型会做类型检查工作。

  1. PDB文件是作什么用的?里面包含了什么信息?

程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。

  1. Cyclomatic Complexity是什么?为什么它很重要?

圈复杂度,用于衡量程序的分支数量。一个正常的方法,分值应该控制在5,6个,如果分支数太大,则最好进行方法的分解,避免badsmell.

  1. 为创建一个critical section以访问某个变量书写一个标准的lock() 并加上double check。

If(m_Instance!=null)

{

lock(this)

{

if(m_Instance!=null))

{

//do something

}

}

}

  1. 为某个对象实现标准的Dispose模式。

Class MyObject:Idisposable

{

public void Dispose()

{

//do something

}

}

就是实现Idisposable接口,进而实现自定的析构

  1. 什么是FullTrust? 存在于GAC中的 assembly 拥有FullTrust么?
  1. 下面这个命令是做什么的?gacutil /l | find /i “system”

全局程序集缓存工具使您可以查看和操作全局程序集缓存和下载缓存的内容。

  1. 下面这个命令是作什么的? sn -t something.dll

Sn.exe 提供用于密钥管理、签名生成和签名验证的选项。

  1. 跨防火墙的 DCOM必须打开哪个端口?端口135是用来做什么的?
  1. 有什么办法可以与现有unmanaged code集成?在集成的时候应该考虑什么问题?
  1. 简要解释一下OOP与SOA都是用来作什么的?

OOP是一种程序编程架构,包含几个特征:组件,封装,继承,抽象,多态。

SOA叫面向服务架构。

  1. XmlSerializer是如何工作的?进程运行XmlSerializer时候需要什么样的ACL权限?

ACL访问控制列表。

  1. 在系统设计时,何时应该使用try catch?何时需要避免使用?
  1. Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?

都是断言。Debug.Write()为调试版本,在发行版本里面不会被执行,而Trace.Write在发行版本中会被执行。

  1. Debug Build和Release Build有什么区别?在执行效率上有什么明显的区别么?

Debug build的版本包含了一些调试信息,执行效率会低一些。

  1. JIT是针对Assembly还是Method发生的?解释一下为什么.NET的设计者要这样做?
  1. 简要描述一下GC的执行过程。

当内存减少到某个程度之后,CLR启动垃圾回收,将那些不被引用的对象回收并释放所占用的内存。

  1. 应该如何选择使用abstract class还是interface?

抽象类可以有实现,接口无实现。接口可以多继承,抽象类不行。

  1. 在设计一个自定义类型时应如何选择使用Value Type还是Reference Type?

其实要描述的就是引用类型和值类型的区别。可以从内存分布和访问效率两方面谈。

  1. 对于Value Type和Reference Type,a.Equals(b)的默认实现方式有什么不同?

值类型默认就是指是否相等。引用类型就是比较两个引用是否指向同一个对象。

  1. .NET中为什么不提供默认的deep copy?如果需要,要如何实现deep copy?

因为深度拷贝涉及到拷贝的级数问题,就是需要深度拷贝到什么层次。在C#中,不可以直接覆写MemberwiseClone方法,可以实现Iclone接口来实现自定义的深度拷贝。

  1. 相对于.NET 1.1,.NET2.0为了避免过度的boxing/unboxing造成的系统开销提供了哪些支持?

范型。

  1. String是Value Type还是Reference Type?为什么.NET中的String对象被设置成immutable?

是引用类型。因为字符串对象在操作系统中出现的频率很高,如果为每一个string都分配一个独立的内存,将会是很大的系统开销。所以string 设置为不可变的,就是一种内存驻留技术,本质上就是让同样的字符串都访问同一块内存。比如:s1=”a”,s2=”b”,则s1和s2其实都是指向同一块为”a”的内存;如果现在修改s1=”b”,则s1将不再指向”a”,而是开辟另一块为”b”的内存空间,使s1指向b(其实如果有另一个s3=”b”,则s1就会和s3指向同一个”b”,此时s1不再重新开辟空间)。

时间: 2024-08-13 02:44:45

你是高级程序员?那就来挑战一下!的相关文章

成为高级程序员的10个步骤

成为高级程序员的10个步骤 步骤1:奠定基础 <The Pragmatic Programmer >对于我们掌握软件是一个很好的起点.该书总结了高水平的实践探索.这与我们使用的是什么语言/技术无关.无论你选择的是哪种技术堆栈,其主要原理都是一样的. 步骤2:掌握你的编程语言 你以后每天需要面对哪种编程语言取决于你今天选择的技术.但是编程语言总有主次之分.例如,Ruby on Rails 开发人员主要使用 Ruby,AngularJS 开发人员大多数时间用的是 JavaScript.确定编程语言

大家在寻找的高级程序员到底是什么样子的?

如果第二次看到我的文章,欢迎右侧扫码订阅我哟~  ?? 每周五11:45 按时送达.当然了,也会时不时加个餐- ?我的第「110」篇原创敬上 你好,我是Z哥. 这篇文章主题很简单,就是一个很常见的话题“什么是高级程序员?”. 文章稍微长了些,但是很容易阅读. 我们的中国文化,对“面子”看的特别重,所以你会发现身边到处都是高级XXX,听着倍儿有面子,程序员也不例外. 但是你真要问每个人,你认为的高级XXX是什么样子的.估计每个人都有不同的回答. 我还记得在我刚开始从事编程工作的时候,对坐在边上不远

优秀程序员——初中高级程序员分类

优秀的程序员 根据这三个维度的水平差异,我们对初级程序员.中级程序员.高级程序员做一个简要的描述. 01 初级程序员 - 知道有事要做 处在初级阶段的时候,我们的精力大多只会专注在专业能力的提升上.这个时候「领导能力」和「连接能力」是很弱的. 所以,这个时候哪怕你有强烈的好奇心也无法很好的表达出来,大多只能被动的接受工作安排. 在这个时期做事情需要依赖一些教程.文档,只能“依样画葫芦”,几乎不能在不借助外部信息的情况下解决之前从未遇到过的新问题,所以百度.Google就成了他们唯一的选择. 你可

java 面试,java 后端面试,数据库方面对初级和高级程序员的要求

本内容摘自 java web轻量级开发面试教程 对于合格的程序员,需要有基本的数据库操作技能,具体体现在以下三个方面. l  第一,针对一类数据库(比如MySQL.Oracle.SQL Server等),会基本的增删改查操作,会用一些基本的函数,会编写存储过程触发器索引等工具. l  第二,知道一些基本的对项目开发有帮助的概念,比如范式.索引.分区等. l  第三,能编写一些相对复杂的SQL语句,比如带连接.带子查询.嵌套查询等. 对于高级程序员,用过的数据库种类当然是越多越好,此外,还要掌握如

作为高级程序员应具有的基本素质

那么作为高级程序员,以至于系统分析员,也就是对于一个程序项目的设计者而言,除了应该具备上述全部素质之外,还需要具备以下素质: 第一,需求分析能力 对于程序员而言,理解需求就可以完成合格的代码,但是对于研发项目的组织和管理者,他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢? 一般而言,进行研发任务,也许是客户提出需求,也许是市场和营销部门提出的需求,这时候对于研发部门,他们看到的不是一个完整的需求,通常而言,该需求仅仅是一些功能上的要求,或者更正规些,可能获得一个完整的用户视

高级程序员

1.敢于攻坚和创新 难题可以选取有效的方法去攻破 2.算法和基本功扎实 易于总结和扩展 3.代码结构清晰,易懂 模块易拆分,后人易上手. 4.代码可重用性高 减少代码量,易于升级和替换 如果可重用性低,那么,随着业务的扩展和升级,旧代码的修改量随需求量呈几何级数上升. 时间和人力资源,也是几何级数上升. 最终,这坨代码就会成为死代码,没有生命力,无法繁殖和继承. 后来的人,上手会很痛苦.部分人会选择重构代码. 那么,重构业务代码的前提是要充分理解业务需求.在理解不完备的前提下,去做重构,就是对a

细说高级程序员的几个成长阶段

转发自:http://chuansong.me/n/1522918 软件开发是一个奇怪的行业,市场远远供不应求.这是一个已经存在多年的问题,而且随着时间的流逝,愈演愈烈. 我们严重缺乏能够满足需求的人才.这个行业相当年轻.大多数软件项目是失败的.几乎所有的项目都会超出预算.我们解决问题的最佳指导方针可以归结为——“用一些通用方法去解决问题,当然这些方法常常不管用,于是,唯一能做的就是不断地尝试,逐个看看是否奏效”. 现在我们把淫浸代码时间超过3年的开发人员称为“高级开发人员”.这些人通常把持领导

如何成为一个C++高级程序员

C++这门语言从诞生到今天已经经历了将近30个年头.不可否认,它的学习难度都比其它语言较高.而它的学习难度,主要来自于它的复杂性.现在 C++ 的使用范围比以前已经少了很多,java.C#.python 等语言在很多方面已经可以代替C++.但是也有很多地方是其他语言完全无法替代的,主要集中在需要运行效率比较高的行业,比如游戏.高效的服务器. 现在学习 java.C#等语言的人数远远高于C++,主要是 C++ 的入门门槛太高,可能学习了一段时间后还做不了什么东西,导致信心大受打击,进而放弃. 我想

高级程序员和低级程序员的区别

低级程序员认为自己与高级程序员的区别, 主要是高级程序员任何功能都能编码实现, 编码速度快, 代码无 bug. 正如一惯的那样, 低级程序员之所以低级, 正是因为他们勉强能看到(或者根本看不到)事物的表象而看不到本质. 所以, 低级程序员总结出的一切东西, 你都可以大胆的忽略. 所以, 我们来听听高级程序认为自己与低级程序员的区别是什么. 高级程序员之所以高级, 在于他们认识到代码 bug 是不可避免的, 有千万种理由可以导致 bug, 但他们可以在设计和逻辑上保证(追求)滴水不漏, 并用逻辑的