C#基础概念面试题

1. 什么是装箱和拆箱 ?什么是重载?什么是受管制的代码?什么是强类型系统?
CTS、CLS和CLR分别作何解释?什么叫应用程序域?
答:装箱就是把值类型转成引用类型:装箱就是把引用类型(包括int与结构这样的内置类型)转换为object类型,拆箱就是把object类型转换为引用类型,装箱与拆箱实现了,实现了两种类型的互换;从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反;
   重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.
   受管制的代码:在.NET环境中运行的代码都称为受管制的代码(managed code)。.NET外部的其他代码也运行在Windows上,这些代码称为示受管制的代码(unmanaged code)。
   CTS公共类型系统,.net支持的语言使用相同的数据类,为了实现语言的互操作性,必须有一组各种语言都认可的基本数据类型,这样才能对所有语言进行标准化处理。还提供了定义定制类的规则。
   CLS公共语言系统,实现多种语言。这是确保代码可以在任何语言中访问的最小标准集体。所有用.NET的编译器都应支持CLS。CLS构成了可以在.NET和IL中使用的功能子集,代码也可以使用CLS外部的功能。如果非CLS功能在代码所在装配件的外部是可见的,那么这些功能就不能在某些语言中使用。
   CLR公共语言运行时,多种语言程序运行的引擎.它可以处理加载程序、运行程序的代码,以及提供所有支持服务的代码。
   应用程序域就是程序代码的作用范围,尤其是变量的,托管代码是为面向公共语言运行库的服务编写的代码,变量类型分得比较多,赋值前就知道类型.
2.C# 中的接口和类有什么异同。
答:接口主要是有于交互。它定义一种契约。接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
   而类是负责功能的具体实现! 类主要是用于复用。
   接口继承则必须实现属性和方法,类继承更多关注是扩展和多态.
   接口可由方法、属性、事件、索引器或这四种成员类型的任何组合构成。接口不能包含字段。接口成员一定是公共的。
   使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护。
   接口和类都是类;不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用。
   在类中也有抽象类的定义;抽象类与接口的区别在于: 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。 但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口。
3. 进程和线程分别怎么理解和区别 ?进程与程序的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位;
   一个进程可以有多个线程,这些线程共享这个进程的资源。一个进程内可以有多个线程,但是线程内不可能有进程。一个程序可以开多线程来完成不同或相同的工作。
    程序包含了若干进程,每一个进程包含了一个或多个概念上知执行的线程。
    通俗的讲:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子.
    一般,一个应用程序对应于一个或多个进程,可以把进程看作是该应用程序在操作系统中的标识;而一个进程通常由多个线程组成,而线程是操作系统为该应用程序分配处理时间的最小单元。
4. 如何理解委托?
答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
   msdn2005中是这样解释的,委托具有以下特点:委托类似于 C++ 函数指针,但它是类型安全的、委托允许将方法作为参数进行传递、委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法、方法不需要与委托签名精确匹配。
    有关更多信息,请参见协变和逆变。C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
5. 概述反射和序列化
答:反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
   序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
6. 概述 o/r mapping 的原理
答:利用反射,配置 将类于数据库表映射
7. 类成员有几种可访问形式 ? 简述可访问形式修饰符的访问权限。
答:可访问形式有 private、 protected、 public、 internal;
   public(公共的) 完全公开,访问不受限制。
   protected(保护的) 访问仅限于包含类或从包含类派生的类型。该类内部和继承类中可以访问。
   internal(内部的) 访问仅限于当前程序集。在同一命名空间内可以访问。
   protected internal(内部保护的) 访问仅限于从包含类派生的当前程序集或类型。
   private(私有的) 访问仅限于包含类型。在类的内部才可以访问。
8. sealed 修饰的类有什么特点
答:sealed(密封的)修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。密封类不能同时为抽象类。
   sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
9. 值类型和引用类型的区别? 写出C#的样例代码。
答:结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的。
10. 传入某个属性的 set 方法的隐含参数的名称是什么?
答:隐含参数的名称是value,它的类型和属性所声名的类型相同。
11. 如何在 C# 中实现继承?
在类名后加上一个冒号,再加上基类的名称。
12 .对象能否调用静态方法
答:不能。对于类内部定义的静态变量及静态方法,该类的对象均不能调用。
13.C# 支持多重继承么?
答:类之间不支持多重继承,接口之间支持。类对接口叫做实现,不叫继承。
14. protected 修饰的属性 / 方法在何处可以访问?
答:在继承或间接继承与这个类的子类中可以访问。
15. 私有成员会被继承么?
答:会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
16. 请描述一下修饰符 protected  internal
答:被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。
正确答案是,在同一个Assembly中,他的访问级别和public一样,而跨Assembly访问时,他的访问级别同protected一样。即protected的范围 + internal的范围。
8.C# 提供一个默认的无参数构造函数 ,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?
答:两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。
17.C# 中所有对象共同的基类是什么?
答:System.Object.
19. 在方法定义中, virtual 有什么含意?
答:被virtual修饰的方法可以被子类覆写。
20. 能够将非静态的方法覆写成静态方法么?
答:不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。
答案并没有大错,只是静态方法根本无override概念,属于引起困惑的问题 。
21. 可以覆写私有的虚方法么?
答:不可以,甚至子类中无法访问父类中的私有方法。
22. 能够阻止某一个类被其他类继承么?
答:可以,使用关键字sealed。 还可以将所有构造函数的访问级别都设为Private或子类无法访问到的其他级别(Assembly外的iternal),也有同样的效果。
23. 能够实现允许某个类被继承 ,但不允许其中的某个方法被覆写么?
答:可以,标记这个类为public,并标记这个方法为sealed。
24. 什么是抽象类( abstract class )?
答:一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。
25. 何时必须声明一个类为抽象类?
答:当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
26. 接口( interface )是什么?
答:只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。
27. 为什么不能指定接口中方法的修饰符?
答:接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。
28. 那么如果这些接口中有重复的方法名称呢?
答:这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。
29. 接口和抽象类的区别是什么?
答:接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。 还有一个容易被忽视的区别,C#不允许接口带有静态成员,尽管这不是.NET的限制。
30. 如何区别重载方法?
答:不同的参数类型,不同的参数个数,不同的参数顺序。
31.const readonly 有什么区别?
答:const关键字用来声明编译时常量,readonly用来声明运行时常量。
还有一些区别,当应试者提到时你不能说是错的:作字段时const隐含静态,const可以是局部的,readonly可以在构造函数中初始化等。 
32.System.String System.StringBuilder 有什么区别?
答:System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。
33 、在 C #中, stringstr=null 与stringstr=“”请尽量使用文字或图象说明其中的区别。
答:stringstr=null是不给他分配内存空间,而stringstr=""给它分配长度为空字符串的内存空间.
回答要点:说明详细的空间分配。(10分)
34 、请详述在 dotnet 中类 (class) 与结构 (struct) 的异同:
答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.
35. 执行下面代码后:
String strTemp ="abcdefg 某某某";
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
问:i=(14 ) ;j=(11 )
答:i=(14 ) ;j=(11 ) 中文两个字节
37 、公司要求开发一个继承 System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行(排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路:
答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中
38.Params 是什么含义?
答:Params是C#中的关键字,采用此关键字可以指定参数数目为可变;在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。
如:
public int fConvert(paramsint[]iParas)
{

}
39 C# 中有没有运算符重载? 能否使用指针?
答:有,C#中也有运算符重载,如对运算符“+”进行重载;
    C#中也可以使用指针,但要声明为unsafe。
40 C# 中有很多类被定义为 public 有什么意义?
答:C#中很多类被定义为public表示当前类的外部对于当前类的访问没有任何限制。
41 Internal 修饰符有什么含义?
答:internal(内部的)数据访问修饰符,表示对所修饰的成员在当前程序集内可以进行没有任何限制的访问;但在当前程序集外部则不能进行访,其可访问性级别低于public,高于protected。
42 JAVA 的代码是半编译半解释的 C#的代码是否也是这样 ?
答:C#中对于程序代码的处理很类似于Java中的程序代码处理机制;也可以称作半编译半解释,具体为:所有.NET源代码(不管用哪种言编写)在进行编译时都被编译成IL。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。
43 CLR IL 分别是什么含义?
答:CLR:公共语言运行时,类似于Java中的JVM,Java虚拟机;
   在.Net环境下,各种编程语言使用一种共同的基础资源环境,这就是CLR,CLR将直接与操作系统进行通信,而编程语言如C#.NET将尽量避免直接与操作系统直接通信,加强了程序代码的执行安全性;
   可以这样看:CLR就是具体的编程语言如:C#.NET与操作系统之间的翻译,同时它为具体的编程语言提供了许多资源:
   面向对象的编程模型(继承、多态、异常处理和垃圾收集等)、安全模型 、类型系统 、所有.NET基类、许多.NETFramework类 、开发、调试和评测(profiling)工具 、执行和代码管理 、IL到本地代码(IL-to-native)转换器和优化器 ;
   IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码(不管用哪种语言编写)在进行编译时都被编译成IL。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。
44.C# 中的委托是什么 ?事件是不是一种委托?
答:委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向一个函数的引用。
    事件是一种特殊的委托
45. 重载与覆盖 ( 重写 ) 的区别?
答:重写是进行基类中函数的重写。为了适应需要。
    重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。
    <1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系
   <2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
    <3、覆盖要求参数列表相同;重载要求参数列表不同。
<4、覆盖关系中,调用那个方法体,是根据对象的类型(对像对应存储空间类型)来决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的。
重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。
46.Overloaded( 重载 ) 的方法是否可以改变返回值的类型 ?
答:Overloaded的方法是可以改变返回值的类型。
47. 描述一下 C# 中索引器的实现过程 ,是否只能根据数字进行索引?
答:不是。可以用任意类型。
48. 如何处理几十万条并发数据
答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.
49. 堆和栈的区别?
答:栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
    堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。
50. 成员变量和成员函数前加 static 的作用?
答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。
51. c# using new 这两个关键字有什么意义 ,请写出你所知道的意义?
答:using指令和语句new创建实例  new 隐藏基类中方法。
    using 引入名称空间或者使用非托管资源
    new 新建实例或者隐藏父类方法
  Using 引入一个名子空间,或在使用了一个对像后自动调用其IDespose
  New 实例化一个对像,或修饰一个方法,表此方法完全重写此方法.
52. 什么是反射? 答:动态获取程序集信息
53.c# 中的三元运算符是? 答:?:。
54. 当整数 a 赋值 给一个object对像时,整数a将会被?答:装箱。
55. 类成员 有_____种可访问形式?答:this.; new Class().Method;
56.public static const int A=1;这段代码有错误么?是什么?答:const不能用static修饰。
57.float f=-123.567F ; int i=(int)f;i的值现在是_____? 答:-123。
58. 委托声明 的关键字是______?答:delegate.
59. sealed 修饰的类有什么特点 ?答:密封,不能继承。
60. Singleton 如何写设计模式 . 答:static属性里面new ,构造函数private
61. 什么是虚函数? 什么是抽像函数?
答:虚函数:没有实现的,可由子类继承并重写的函数。抽像函数:规定其非虚子类必须实现的函数,必须被重写。
62.C# property( 属性 ) 与 attribute(特性)的区别,他们各有什么用处,这种机制的好处在哪里?
答:一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质。
    attribute:自定义属性的基类;property :类中的属性
63.C# 可否对内存进行直接的操作?
答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员 不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法
64. & && 的区别。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).
65 :您在什么情况下会用到虚方法? 它与接口有什么不同?
答:多态的种类有两种,一为基类继承多态(Base Class Polymorphism),二为接口继承多态(Interface Polymorphism)。
   虚函数的使用实现的是基类继承多态,从设计模式的角度来说基类继承体系描述的是Is-A的问题。比如飞禽就是基类(父类),麻雀和鹤为子类继承了飞禽这个类。麻雀和鹤“Is-A”飞禽。
   除了基类继承多态,我们还有一种接口继承多态。顾名思义,这种多态是通过继承(更确切的说是“实现”)接口而产生继承体系的。从设计模式的角度来说接口继承体系描述的是Is-Like-A(或者叫Can-do)的问题(详见博客上另一篇文章《从设计模式看抽象类与接口的区别》)。比如一个具有报警功能的门,我们要实现“报警门”这么一个类,“报警门”“Is-A”门,而不是一个报警器,只是“Is-Like-A”报警器而已。所以“报警门”的报警功能要通过实现报警器这个接口来实现报警功能。
66. 谈谈类和结构的区别
答:最大区别一个是引用类型,一个是值类型 默认成员访问为public是另外一个区别。
67.new 有几种用法 ?
第一种:new Class();
第二种:覆盖方法public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。
68. 如何把一个 array 复制到 arrayList ?
foreach( object o in array )arrayList.Add(o);
69 :软件开发过程一般有几个阶段? 每个阶段的作用?
答:需求分析,架构设计,代码编写,QA,部署或叫分析、需求、实现、维护等阶段。
分析一般进行软件可行性及系统软件开法方法等方面的分析;
需求阶段主要是开发者与用户的一个交流,开发者必须要了解这个软件要实现些什么功能,有些什么特殊的要求;
实现阶段主要是编码和单元测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐韬科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值