• 面试题-基础篇(1)


    堆和栈的区别?
    堆是编译期间由编译器自动分配内存空间,代码中必须对栈的大小有明确的定义;而堆是程序运行期间动态分配内存空间,可根据程序的运行情况确定要分配的堆内存大小。
    值类型和引用类型?
    值类型的变量直接存储的就是数据,而引用类型变量存储的对数据的引用;
    因此,值类型变量在赋值时,赋值的是变量包含的值,而引用类型在赋值时只是复制对象的引用,也就是一个存储地址;
    值类型的变量的数据存在栈中,而引用类型的变量的值存储在堆中;
    值类型变量不可以赋值为null,除非可空类型,而引用类型可以;
    值类型继承自System.ValueType,引用类型继承自System.Object。
    进程和线程?
    进程是系统进行资源分配和调度的单位,线程是cpu进行调度和分派的单位;
    进程 一个程序至少有一个进程,一个进程至少有一个线程;
    进程有独立的地址空间,所以一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程之间没有独立地址空间,同一进程的多个线程间是共享资源的,一个线程死掉就等于整个进程都卡掉了。
    描述一下修饰符protected internal?
    
    被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。
    
    能够阻止某一个类被其他类继承么?
    
    可以,使用关键字sealed。
    
    能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
    
    可以,标记这个类为public,并标记这个方法为sealed。
    
    接口和类区别?
    (1)接口中的方法不能实现,不能有方法体,类可以
    (2)一个类可以实现多个接口,但只能继承自一个基类
    (3)接口中不能定义字段,类中可以
    (4)接口不能实例化,类可以实例化
    接口定义的方法前面不能加任何修饰词 
    类和结构的区别?
    类是引用类型,结构体是值类型;
    类调用new创建对象时,是在堆上分配内存,而结构体实例化时是在栈上分配内存;
    类可以继承和被继承,而结构体都不可以,只可以实现接口;
    类有默认的构造函数,而结构体没有,可以添加带参数的构造函数。
    抽象类和接口?
    相同点:都不能被实例化;都包含未实现的方法声明;派生类都必须实现声明的方法。
    
    不同点:
    
    抽象类是一个不完整的类,而接口是一个行为规范的定义;
    抽象类是类,所以可以定义字段,而接口只能定义属性、事件、方法和索引器,不能包含字段;
    接口可以对多重实现,而抽象类只能被单一继承;
    抽象类可以继承接口,而接口不能继承自抽象类。
    
    什么是抽象类(abstract class)?
    一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。  
    什么时候必须声明一个类为抽象类?
     (1)当这个类中有抽象方法的时候,必须声明类为抽象类
     (2)该类没有完全实现父类的抽象方法时,也需要声明为抽象类
    .net中接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类? 
    答:net中接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。
    重写override和重载overload?
    override是表示重写基类的方法,方法的签名和参数列表都必须与基类的一致;而overload是重载,只要签名相同,参数列表不同。
    重写的基方法必须是 virtualabstractoverride 的,即基方法是虚方法、抽象方法和已经被重写过的方法。其余的普通方法是不能被重写的。
    什么是虚方法?子类需要对虚方法做什么?虚方法有什么用?
    一个方法前面有virtual关键字,这就是虚方法。就是用这个关键字标明这个方法是个虚的,标明这个方法有可能会被后面的子类所重写。
    虚方法实质上是C#多态性的一个体现,所以当需要指明某个方法具有多态性时,就使用虚方法。父亲定义了一个方法,这个方法标明是个虚的,动态的,儿子可以重写这个方法,也可以不重写,儿子需要调用这个方法时,会优先调用自己重写后的方法,如果没有,则只能使用父亲定义的方法。
    而抽象方法,则是父亲定义了一个方法的签名,但不能有实现代码,强制儿子类中必须有这样一个方法,强制儿子必须要重写实现这个方法。
    
    虚函数(Virtual),抽象函数(abstract)和接口的区别?
    1.virtual:允许被重写,但不强制要求。声明时提供其自身实现; 
    2.abstract:强制要求其继承者重写。声明时不提供其自身的实现,抽象类不能被实例化; 
    3.interface:接口就是协议,其声明的成员(属性,方法,事件和索引器)必须由其继承的类实现。接口不能直接被实例化。 
    虚方法与抽象方法的区别在于,虚方法提供自身的实现,并且不强制要求子类重写;而抽象方法不提供自身的实现,并且强制子类重写。 
    抽象类与接口很相似,但是思路不一样。接口是公开类的成员,而抽象类则是抽象类成员以要求子类继承并实现。
    new关键字用法?
    new作为运算符,用于创建对象和调用构造函数;
    new作为修饰符,用于继承类向基类隐藏成员;
    new作为约束,用于在泛型声明中约束可能用作泛型的类型参数的参数的类型。
    string和StringBuilder区别?
    string在进行赋值、拼接等运算时,实际上是会产生一个新的对象,存储运算后的值,而将原来的对象删除了,这在创建和销毁对象时就消耗了时间。而StringBuilder,它提供了Append方法,修改时就直接在原有对象上修改。一般情况下,可能感觉不到这个差异,但在对字符串进行频繁操作时,就会有较大差异,建议使用StringBuilder。
    Equals和==区别?
    前者:用于引用类型比较,比较两个变量是否是对同一个对象的引用;后者比较两个变量的值是否相等。
    const和readonly区别?
    const是编译时常数,后者可以是编译时,也可以是运行时常数;
    前者只能在字段声明时初始化,后者可以在声明或构造函数中初始化,构造函数不同,后者可能会有不同的值。
    数组基类
    :Array 委托基类:MulticastDelegate 获取类型大小:sizeof  栈中分配内存:stackalloc
    从面向对象的角度思考,什么是多态。 
    答:多态是指两个或多个属于不同类的对象,对于统一个消息(方法调用)作出不同响应的方式
    强类型?弱类型?
    强类型是在编译时就确定类型,执行时不可更改;而弱类型实在执行时才确定类型。强类型更安全,弱类型灵活但不安全。
    C# Show()和ShowDialog()?
    show()是非模式窗体.
    showDialog()是模式窗体.
    区别在于,以showDialog()打开的窗体,要等窗体关闭后才能操作其他窗体.而show()则不受此限制.
    return和finally?
    return只是标记函数的返回值为0,标记完了继续执行finally。
    装箱?拆箱?装箱和拆箱操作中的性能损耗是如何产生的?
    装箱是将值类型转化为引用类型的过程;拆箱是将引用类型转化为值类型的过程”。
    “箱”指的就是托管堆,装箱即指在托管堆中将在栈上的值类型对象封装,生成一份该值类型对象的副本,并返回该副本的地址。而拆箱即是指返回已装箱值类型在托管堆中的地址。
    Int32 i =4;  定义一个值类型 
    objct o = i; [装箱]这个值类型被复制并分配到托管堆,并把它转成引用类型O,这一个过程将会造成性能损失。
    Int32 n = (Int32)O;[拆箱]将托管堆中的引用类型实例复制到栈中,转为值类型n
    装箱比拆箱损耗大。
    装箱内耗:分配内存,拷贝数据。
    1、首先从托管堆中为新生成的引用对象分配内存。 2、然后将值类型的数据拷贝到刚刚分配的内存中。 3、返回托管堆中新分配对象的地址
    拆箱内耗:拷贝数据
    1、首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。 2、将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。
    code_Bhind技术?
    
    答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.
  • 相关阅读:
    闲谈:价值、服务、时间、用户体验、美、过度开发
    笔记:Sublime Text 3
    快速切换目录命令go
    miniPy for CentOS 5/6
    用Fabric实现小批量的自动化上线
    异步多线程C/S框架gko_pool
    Reboot分享第三期(已结束)
    Reboot分享第二期(已结束)
    Reboot分享第一期(已结束)
    iptables从入门到精通
  • 原文地址:https://www.cnblogs.com/rwh871212/p/6961586.html
Copyright © 2020-2023  润新知