0x00 - 事件

事件模式要求所有的事件处理函数返回类型都是 void。因为事件发生后可能会调用好几个回调方法,没办法获得所有方法的返回值,将返回类型设为void,就可以避免时间处理函数返回值。

0x01 - 多态

  1. 虚方法实现; virtual,可以实例化。
  2. 抽象类,抽象方法;abstract,不可以实例化。
  3. 接口实现;interface,需要接口的时候可以直接用一个类型的实例传递过去。

override 用来覆盖 abstract, virtual 方法。

0x02 - 什么是基类?

类声明可以通过类名加一个冒号和基类名来指定基类。省略基类说明等同于从object类派生。

0x03 - 方法签名

c#的方法签名指的是 方法名和参数不包含返回值类型的区别

但是 IL 中是支持同步返回值类型的不同来区分方法的。

0x04 - C++与GC

标准的C++不支持GC,但是C++的有的实现是支持GC的,比如 C++/CLI( common language Infrastructure), 也即微软实现的托管版C++。

0x05 - 接口 - Interface

接口不可以创建实例,接口也不可以包含字段(field)。但接口可以包含属性Property,因为Property本质上是方法。

定义: Interface 只可以包含方法、属性、索引器或事件的签名。

属性、索引器本质上都是方法;索引器是带参数的方法,c#中是用数组访问符 [ ] 来实现的

0x06 - 编译时多态性和运行时多态性的区别是什么?

编译时多态性

编译时多态性也被称为方法重载。 overload

方法重载是指有两个或更多同名但含有不同签名的方法。

运行时多态性

运行时多态性也被称为方法重写。 override

方法重写是指有两个或更多的同名方法,含有相同的方法签名但对应不同的实现。

0x07 - 方法与函数 (Method vs Function)

A method is on an object; A function is indepent of an object.

For C# and java, there are only methods, For C, there are only functions.

For C++, it would depend on whether or not the code is in a class.

0x08 - const 和 readonly 的区别?

const 必须在声明时初始化。

readonly 可以在声明时或在构造函数中初始化。

0x09 - ADO.NET

1. ExecuteNonQuery()

Non 是的意思,NonQuery 即非查询语句。

这个方法的返回值是,执行语句影响的行数

2. ExecuteReader()

返回一个SqlDataReader对象,用于读取查询的数据。

0x10 - 软件文档

  1. 软件工程的三大文档(需求分析说明书)(概要设计说明书)(详细设计说明书)。

0x11 - SOA vs SOAP

  • SOA - (Service-oriented Architecture)面向服务架构
  • SOAP(Simple Object Access Protocol )简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议。

0x12 - Debug vs Release

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

是,比如自动属性生成的方法代码,在 Release时会进行 Code Inline (内联)优化, Debug时不会。

0x13 - 为什么不提倡catch(Exception)?

A: try catch 并不会明显影响代码的性能,但是catch最好捕获 specific 异常,以执行相应的恢复处理,或者帮助进行bug的定位。

0x14 - override vs new & what is shadowing?

  • Overriding : redefining an existing method on a base class ( by override keyword )
  • Shadowing : creating an entirely new method with the same signature as one in a base class (by new keyword)
  1. 子类使用new关键字屏蔽父类的方法,则调用谁的方法由“定义时的类型决定”;
  2. 子类使用override关键字重写父类方法,则调用谁的方法由”运行时引用真实的对象决定“。

即: new 关键字表示,子类只是和父类使用了同一个方法签名,但这两个方法完全没有关系。 override关键字表示, 子类的这个方法和父类的方法是要遵循 c#的多态规则的

override 关键字只能用于virtual 或 abstract关键字标志的方法,virtual是c# 实现多态的方式。

0x15 - 面向对象

  • 面向对象的基础是 – 封装;
  • 核心是 – 多态;
  • 表现形式是 – 类和继承。

0x16 - 进程 & AppDomain

  • 进程是OS用来隔离资源的 单位。
  • AppDomain 是 .net 中引入的概念,一个.net 进程可以包含多个 AppDomain,Appdomain 可以看作一个轻量级的进程。

0x17 - GC

GC指的是对 堆对象(Heap)进行回收,不包括桟对象。

0x18 - new 一个对象时发生了什么?

  1. 计算类型其基类型 中所有实例字段需要的字节数。加上类型对象指针同步索引块所占用的字节大小。
  2. 从堆中分配相应的字节数,并所有字段初始为零。
  3. 初始类型对象指针同步索引块
  4. 最基类默认无参构造函数开始,层层向下直至定义类,逐个调用构造函数,初始化相应的实例字段。

c# 没有 delete关键字来释放内存,采用的是CLR提供的 GC功能。

0x19 - 值类型装箱发生了什么?

0x20 - DataGrid.EnableRowVirtualization Property(datagrid 行虚拟化)

To improve performance, the EnableRowVirtualization property is set to true by default. When the EnableRowVirtualization property is set to true, the DataGrid does not instantiate a DataGridRow object for each data item in the bound data source. Instead, the DataGrid creates DataGridRow objects only when they are needed, and reuses them as much as it can. For example, the DataGrid creates a DataGridRow object for each data item that is currently in view and recycles the row when it scrolls out of view.

0x21 - 素数(质数 Prime)判定

  • 最简单的,根据质数定义
    bool isPrime_1( int num )
    {
      int tmp =num- 1;
      for(int i= 2;i <=tmp; i++)
        if(num %i== 0)
           return false;
      return true;
    }
    
  • 对于每个数n,其实并不需要从2判断到n-1。
  • 我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n)。
  • 据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。
bool isPrime_2( int num )
{
     int tmp =sqrt( num);
     for(int i= 2;i <=tmp; i++)
        if(num %i== 0)
          return false ;
     return true;
}

0x22 - Object.MemberwiseClone()

方法签名: protected object MemberwiseClone()

The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object. If a field is a value type, a bit-by-bit copy of the field is performed. If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.

other

Debug.Write和Trace.Write有什么不同?何时应该使用哪一个? a.Equals(b)和a == b一样吗? 使用Primary Interop Assembly (PIA)有什么好处? catch(Exception e){throw e;}和catch(Exception e){throw;}的区别 typeof(foo)和myFoo.GetType()的区别?

Undisclosed - 未公开

  • Component Software Programming (组件软件编程,CSP)