• [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();

  • 相关阅读:
    基于.Net Core的Redis:实现查询附近的地理信息
    基于.Net Core的Redis:基本数据类型及其应用场景与命令行操作
    C# WebClient几种常用方法的用法
    const学习(续)
    C++ const学习
    Unicode
    android studio下使用HAXM android模拟器(x86)加速器
    使用efinance包获取股票数据
    Linux初识
    UWSGI
  • 原文地址:https://www.cnblogs.com/Chary/p/No000097.html
Copyright © 2020-2023  润新知