C# 10个面试题带答案

值类型和引用类型的区别?

值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。

值类型存取速度快,引用类型存取速度慢。

值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用

值类型继承自System.ValueType,引用类型继承自System.Object

栈的内存分配是自动释放;而堆在.NET中会有GC来释放

值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。

何时必须声明一个类为抽象类?

当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时

foreach和for循环谁的效率高?switch和if呢?

foreach高,for 循环每次都要进行判断i的大小,foreach 依赖 IEnumerable.第一次 var a in GetList() 时调用 GetEnumerator 返回第一个对象并赋给a,以后每次再执行 var a in GetList()的时候 调用 MoveNext.直到循环结束。期间GetList()方法只执行一次.

同样的道理:当有多个判断时,switch更快。

out 和 ref的区别与相同点

out 和 ref都指示编译器传递参数地址,在行为上是相同的;

他们的使用机制稍有不同,ref要求参数在使用之前要显式初始化,out要在方法内部初始化;

out 和 ref不可以重载,就是不能定义Method(ref int a)和Method(out int a)这样的重载,从编译角度看,二者的实质是相同的,只是使用时有区别:

使用ref型参数时,传入的参数必须先被初始化,对out而言,必须在方法中对其完成初始化

使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配

out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候

简述 private、 protected、 public、 internal、protected internal 访问修饰符和访问权限

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

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

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

internal: 当前程序集内可以访问。

protected internal: 访问仅限于当前程序集或从包含类派生的类型。

不带修饰符的类是默认internal。

virtual,sealed,override,abstract的区别?

virtual声明虚方法的关键字,说明该方法可以被重写

sealed说明该类不可被继承

override重写基类的方法

abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。

什么是匿名方法?请写一段代码。

delegate(int i) { return i > 0; }

接口和抽象类有什么区别?

含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract,class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型

下面比较一下两者的语法区别:

抽象类可以有构造方法,接口中不能有构造方法。

抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

抽象类中抽象方法可以指定为public,接口中抽象方法不能指定任何修饰符,默认就是public

一个类可以实现多个接口,但只能继承一个抽象类。

public static const int A=1;这段代码有错误么?是什么?

const不能用static修饰

写一个单例模式。

public class Singleton

    {

        private static Singleton _Singleton = null;

        private static object Singleton_Lock = new object();

        public static Singleton CreateInstance()

        {

            if (_Singleton == null) //双if +lock

            {

                lock (Singleton_Lock)

                {

                    Console.WriteLine("路过。");

                    if (_Singleton == null)

                    {

                        Console.WriteLine("被创建。");

                        _Singleton = new Singleton();

                    }

                }

            }

            return _Singleton;

        }

    }

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值