[No000097]程序员面试题集【下】

1.下面中共包含()个正方形?40

计算规律,设大长方形长是5,宽是4,小正方形边长是1,那么图中.小正方形的个数是,4*5个,边长是2的正方形的个数是3*4个,边长是3的正方形的个数是2*3个,边长是4的正方形的个数是1*2

所以总共:4*5+3*4+2*3+1*2=20+12+6+2=40

2. CLI:通用语言基础结构(Common Language InfrastructureCLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。(command-line interface,命令行界面)

CLR:公共语言运行库(Common Language Runtime)Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。

IL:MSIL(Microsoft Intermediate Language),是将.NET代码转化为机器语言的一个中间语言,因此又把IL语言称之为伪汇编语言。

JIT:Just-in-time 即时编译

GC:Garbage Collection,.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间(事实上何时清理内存是个复杂的策略)。可以在程序中显式地使用System.gc()/System.GC.Collect()来强制进行一次立即的内存清理。

3. 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些结构?在自定义类型时,您如何选择是类还是结构?

class是引用类型,struct是值类型;Struct有性能优势,Class有面向对象的扩展优势。

class可以继承类、接口和被继承,struct只能继承接口,不能被继承;

class有默认的无参构造函数,有析构函数,struct没有默认的无参构造函数,且只能声明有参的构造函数,没有析构函数;

class可以使用abstractsealed,有protected修饰符,struct不可以用abstractsealed,没有protected修饰符;

class必须使用new初始化,结构可以不用new初始化;当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上

class实例由垃圾回收机制来保证内存的回收处理,而struct变量使用完后立即自动解除内存分配;

从职能观点来看,class表现为行为,而struct常用于存储数据;

作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的。

BCLBase Class Library)是Dot Net Framework下所有语言使用的类库,DateTime是一个结构体。

struct 类型适于表示 PointRectangle Color 等轻量对象。尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。例如,如果声明一个 1000 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。

如何选择使用结构还是类:

1).堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

2).结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低

3).在表现抽象和多级别的对象层次时,类是最好的选择

4).大多数情况下该类型只是一些数据时,结构是最佳的选择

4. 泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?

泛型的作用在于"算法的重用"。优势1.源代码保护。2.类型安全3.更清晰地代码。4.更好的性能,因为值类型可以避免装箱和拆箱所带来的损耗(垃圾回收的次数也会减少); 对性能有积极的影响,因为值类型可以避免装箱和拆箱所带来的负面影响,避免了垃圾回收,使得性能显著提高。但是对引用类型这种影响就不明显了;使用泛型类型参数的一个方法在进行JIT编译时,CLR获取IL,用指定的类型实参进行替换,然后创建本地代码。需要特别注意的是引用类型是共享代码的,而对值类型就会为每一种生成独立的一份类型代码;List、Dictionary、Queue、Stack、SortedList和SortedDictionary、LinkedList等

5. 用扩展方法为c#中的string类型增加一个字符转换为数组的方法

namespace 扩展方法

{

public static class String//扩展方法必须是静态的

{

public static char[] toCharArr(this string _input)//扩展方法必须是静态的,第一个参数必须加上this

{

            char[] charA = new char[_input.len()];

            for(int i = 0 ;i<_input.len();i++)

            {

                charA[i]=_input[i];

            }

return charA;

}

public static string Quot(this string _input, string _quot)//带多个参数的扩展方法//在原始字符串前后加上指定的字符

{

return _quot + _input + _quot;

}

}

    class Program

{

static void Main(string[] args)

{

string _myString = "abc";//这里就可以直接使用string类的扩展方法IsEmail了

Console.WriteLine(_myString.toCharArr());

Console.WriteLine(_myString.Quot("!"));//调用接收参数的扩展方法

Console.ReadLine();

}

}

}

6简述数组,链表,哈希(HASH)各自特点

数组:通过从0开始的索引,可以顺序存取/查找或者随机存取/查找,而链表只能顺序存取/查找;

链表:一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。它通过每个结点中的下一个结点的地址的指针域来查找定位

哈希:根据关键码值(Key value)而直接进行访问的数据结构。

7. 简述一下C#中的Invoke和BeginInvoke的意思,并简述它们的使用场景

多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。

Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。

Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行

8. C#中的委托是什么?事件是不是一种委托?

委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。(类似于C语言中的函数指针,可以把一个方法名作为参数代入另一个方法。);事件是一种特殊的委托,对于事件来讲,外部只能"注册自己+=、注销自己-=",外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。

9.接口和抽象类有什么区别,选择的依据是什么?

抽象类里面可以有非抽象方法但接口里只能有抽象方法,一个类一次可以实现若干个接口,但是只能扩展一个父类;接口是对动作的抽象,抽象类是对根源的抽象。

10. mvc是什么

MVC(模型Model-视图View-控制器Controller)是一种设计模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

11. IOC是什么?有哪些IOC框架

Inversion of Control,即反转控制,或许说为依赖注入更为合适。是一种设计模式。

12. 简述 private protected public internal 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。

internal: 在同一命名空间内可以访问。

13. 页面之间值传递常用的几种方式

1.QuerySting在页面间传递值

2.Session变量

3.Cookie对象变量

4.使用Application 对象变量

14. c#constreadonly区别

const 的概念就是一个包含不能修改的值的变量。readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。

1. const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。

2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。

3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。

4const 对于引用类型的常数,可能的值只能是 string nullreadonly可以是任何类型

总结,const只能在初期就使用常量初始化好。对于每一次编译后的结果,const的值是固定的,而readonly的值是可以在运行的时候才确定值的。

15. public void test(object ii) {

    lock(this){

     if (i>10){

         i--;

         test(i);

     }

    }

},简述死锁的理由:

你在test中lock了,这时代码走到test(i);还是调用test,到lock(this) 是发现已经锁住了 ,所以就等待

16. 简述一下GC算法,微软提供的比较好的对象释放方式是什么,.net可以用析构函数吗?

既然GC负责垃圾回收,所有的算法无外乎都做两件事:(1)找到所有不再使用的对象。(2)回收这些对象的空间。

如:1. 引用计数器;2. 遍历搜索器;3. 碎片整理器;4. 分代收集算法;

2.Dispose 方法(实现 IDisposable 接口);using 语句;try、catch 和 finally 块

3.可以

17. 迭代器的好处(yield)

yield关键字在迭代器中,用于向枚举对象返回元素值或发出迭代结束信号。

迭代器能够在类或结构中支持foreach迭代,而不必实现IEnumerable接口。

创建迭代器最常用的方法是对IEnumerable接口实现GetEnumerator方法。

18. C#中的特性(Attribute)用途,好处,弊端

Attribute:一个类,公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。

19. string是值类型还是引用类型?string str1 = str2 ="12345";str1 = "abc"; str2=?

String是一种特殊的引用类型,str2="12345",str1的改变不会影响str2

20. C#构造函数关键字是private,确通过一个public方法内部new了一个实例

public class Singlton

{

    private static Singleton _Instance;

    provate static readonly object syslocker = new object();

    //私有化构造函数

    private Sinalton()

    {

    }

    public static Singlton GetInstance()

    {

        if(_Instance == null)

        {

            lock(syslocker)

            {

                if(_Instance == null)

                {

                    _Instance = new Singlton();

                }

            }

        }

        return _Instance;

    }

}

使用private将构造私有化,然后通过GetInstance()方法获得实例。这样能保存生成的实例是单一的。不允许用户使用构造函数重新构造。

21. 数据库索引类型有哪些?

Single column 单行索引

Concatenated 多行索引

Unique 唯一索引

NonUnique 非唯一索引

Function-based函数索引

Domain 域索引

物理上:

Partitioned 分区索引

NonPartitioned 非分区索引

B-tree:

Normal 正常型B树

Rever Key 反转型B树

Bitmap 位图索引

索引结构:

B-tree:适合与大量的增、删、改(OLTP);

不能用包含OR操作符的查询;

适合高基数的列(唯一值多)

典型的树状结构;

每个结点都是数据块;

大多都是物理上一层、两层或三层不定,逻辑上三层;

叶子块数据是排序的,从左向右递增;

在分支块和根块中放的是索引的范围;

Bitmap:

适合与决策支持系统;

做UPDATE代价非常高;

非常适合OR操作符的查询;

基数比较少的时候才能建位图索引;

树型结构:索引头

开始ROWID,结束ROWID(先列出索引的最大范围)

22. NoSQL是什么,优点?

NoSQL(Not Only SQL),泛指非关系型的数据库。四大分类:键值(Key-Value)存储数据库;列存储数据库;文档型数据库;图形(Graph)数据库;

弹性可扩展,异步复制,可以处理超大量的数据

23.求斐波那契数列(递归算法)

Public static long F(int n){if(n==1||n==2)return (1L);else return F(n-2)+F(n-1);} //main中计算F(30);

24.猫叫,老鼠跑,主人醒事件

public class Cat// 猫类,发布者

{

    private string _name;

    public event EventHandler<CatCryEventArgs> CatCryEvent;//猫叫事件

    public Cat(string name)// 构造函数

    {_name = name;}

    public void CatCry()/// 触发事件

    {

        CatCryEventArgs args =new CatCryEventArgs(_name);

        Console.WriteLine(_name +" 叫");//猫叫

        CatCryEvent(this,args);

    }

}

public class CatCryEventArgs:EventArgs// 猫叫事件参数,委托

{

    privatestring _catname;

    public CatCryEventArgs(string catname):base()

    {_catname = catname;}

}

public class Mouse //老鼠类,订阅者

{

    private string _name;

    public Mouse(string name,Cat cat)

    {

        _name = name;

        cat.CatCryEvent += CatCryHandle;//订阅猫叫事件

    }

    private void CatCryHandle(object sender,CatCryEventArgs args)// 猫叫事件处理

    {

        Console.WriteLine(_name +"跑");//老鼠跑

    }

}

public class Master//主人类,订阅者

{

    private string _name;

    public Master(string name,Cat cat)// 构造函数,订阅事件

    {

    _name = name;

    cat.CatCryEvent += CatCryHandler;//订阅猫叫事件

    }

    private void CatCryHandler(object sender,CatCryEventArgs args)// 猫叫事件处理

    {

    Console.WriteLine(_name+" 醒") ;

    }

}

Cat cat =new Cat("cat");//主函数调用

Mouse mouse =new Mouse("mouse", cat);

Master master =new Master("master", cat);

cat.CatCry();

原文地址:https://www.cnblogs.com/Chary/p/No000097.html