C#面试基础题1

一、简述 private、 protected、 public、 internal 修饰符的访问权限。(C++中没有internal)javascript

    private : 私有成员, 在类的内部才能够访问 ,也就是类内部的函数等成员能够访问。html

    protected : 保护成员,该类内部和继承类中能够访问。前端

    public : 公共成员,彻底公开,没有访问限制。java

    internal: 当前程序集内能够访问。c++

二、C#中的委托是什么?事件是否是一种委托?事件和委托的关系。程序员

    委托能够把一个方法做为参数代入另外一个方法。委托能够理解为指向一个函数的指针。web

    委托和事件没有可比性,由于委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别事件的内部是用委托实现的。 由于对于事件来说,外部只能“注册本身+=、注销本身-=”,外界不能够注销其余的注册者,外界不能够主动触发事件,所以若是用Delegate就无法进 行上面的控制,所以诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove本身,不能赋值。事件 只能+=、-=,不能= 。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法。正则表达式

三、override与重载(overload)的区别数据库

重载是方法的名称相同。参数或参数类型不一样,进行屡次重载以适应不一样的须要。重载(overload)是面向过程的概念。编程

public void test (String name){
    ......}
public void test (String name,String sex){
    ......}

Override 是进行基类中函数的重写。Override是面向对象的概念

Class Base
{
   virtual  public void fun();
}

Class A: public Base
{
   public void fun();
}

Class B: public Base
{
 public void fun();
}

四、在dotnet中类(class)与结构(struct)的异同?

Class能够被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。

Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。加分的回答:Int3二、Boolean等都属于结构体。

五、堆和栈的区别?

栈是编译期间就分配好的内存空间,所以你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。

堆是程序运行期间动态分配的内存空间,你能够根据程序的运行状况肯定要分配的堆内存的大小。

六、C#中的接口(interface)和类(class)、抽象类(abstract class)有什么异同。

interface与class不一样点:

       不能直接实例化接口。

       接口不包含方法的实现。

       接口能够多继承,类只能单继承。

       类定义可在不一样的源文件之间进行拆分。(这句话不知道怎么理解?考虑1,partial关键字中描述C# 2.0 引入了局部类型的概念。局部类型容许咱们将一个类、结构或接口分红几个部分,分别实如今几个不一样的.cs文件中。

interface与abstract class相同点:

      接口、类和结构均可以从多个接口继承。

      接口相似于抽象基类:继承接口的任何非抽象类型都必须实现接口的全部成员。

      接口和类均可以包含事件、索引器、方法和属性。

interface与abstract class相同点:

      都不能被直接实例化,均可以经过继承实现其抽象方法。

interface与abstract class不一样点:

     接口支持多继承;抽象类不能实现多继承。

      接口只能定义行为;抽象类既能够定义行为,还可能提供实现。

      接口能够用于支持回调(CallBack);抽象类不能实现回调,由于继承不支持。

      接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;

      抽象类能够定义字段、属性、包含有实现的方法。 

      接口能够做用于值类型(Struct)和引用类型(Class);抽象类只能做用于引用类型。例如,Struct就能够继承接口,而不能继承类。

七、GC是什么? 为何要有GC? 

      GC是垃圾收集器。程序员不用担忧内存管理,由于垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection须要程序员调用Dispose进行资源的回收。

八、什么叫应用程序域?什么是受管制的代码?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别做何解释?

     应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域一般由运行库宿主建立,运行库宿主负责在运行应用程序以前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可以使用该单元提供应用程序之间的隔离。

     受管制的代码:在.Net环境中运行的任何代码都是受管制的代码(managed code),.Net外部的代码也运行在windows上,这些代码称为未受管制的代码(unmanaged code)。

     使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具备许多优势,例如:跨语言集成、跨语言异常处理、加强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。

      强类型语言是可以禁止任何违反类型系统的代码的语言,或者说是可以捕获全部违反类型系统的错误的语言。咱们说C++相对于C是强类型的,是由于C++禁止了一些C中的隐式转换,好比将void*转换为任意的指针类型。

      装箱和拆箱使值类型可以被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型能够存储于垃圾回收堆中。拆箱将从对象中提取值类型。

object obj = null;                //引用类型
obj = 1;                         //装箱,boxing。把值类型包装为引用类型。
int i1 = (int)obj;               //拆箱。unboxing(须要使用强制转换)

     每一个类型成员都有一个惟一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不一样,就能够在一种类型内定义具备相同名称的多种方法。当定义两种或多种具备相同名称的方法时,就称做重载

public void test (String name){
    ......}
public void test (String name,String sex){
    ......}

CTS通用类型系统 (common type system)

一种肯定公共语言运行库如何定义、使用和管理类型的规范。

CLR公共语言运行库

.NET Framework 提供了一个称为公共语言运行库的运行时环境,它运行代码并提供使开发过程更轻松的服务。

CLS公共语言规范

要和其余对象彻底交互,而无论这些对象是以何种语言实现的,对象必须只向调用方公开那些它们必须与之互用的全部语言的通用功能。为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。

9.正则表达式的使用

  9.1 电话

public bool IsTelephone(string str_telephone)
   {
            return System.Text.RegularExpressions.Regex.IsMatch(str_telephone, @"^(\d{3,4}-)?\d{6,8}$");
   }

9.2 手机号码

public bool IsHandset(string str_handset)
{
    return System.Text.RegularExpressions.Regex.IsMatch(str_handset,@"^[1]+[3,5]+\d{9}");
}

9.3 身份证号码

public bool IsIDcard(string str_idcard)
{
  return System.Text.RegularExpression.Regex.IsMath(str_idcard,@"(^\d{18}$)|(^\d{15}$)");
}

9.4 验证数字

public bool IsNumber(string str_number)
 {
   return System.Text.RegularExpressions.Regex.IsMatch(str_number, @"^[0-9]*$");
 }

9.5 验证邮编

public bool IsPostalcode(string str_postalcode)
{
     return System.Text.RegularExpressions.Regex.IsMatch(str_postalcode, @"^\d{6}$");
}

9.6 验证邮箱

public bool IsEmail(string str_Email)
{
    return System.Text.RegularExpressions.Regex.IsMatch(str_Email, @"\\w{1,}@\\w{1,}\\.\\w{1,}");
}

十、.Net、ASP.Net、C#、VisualStudio之间的关系是什么?(传智播客.Net培训班原创模拟题)

答:.Net通常指的是.Net Framework,提供了基础的.Net类,这些类能够被任何一种.Net编程语言调用,.Net Framework还提供了CLR、JIT、GC等基础功能。基于.Net语言有C#、VB.Net、F#、PowerShell、IronPython、J#、Ruby.Net。

     ASP.Net是.Net中用来进行Web开发的一种技术,ASP.Net的页面部分写在aspx 文件中,逻辑代码一般经过Code-behind的方式用C#、VB.Net等支持.Net的语言编写。

     C#是使用最普遍的支持.Net的编程语言。除了C#还有VB.Net、IronPython等。

     VisualStudio是微软提供的用来进行.Net开发的集成开发环境(IDE),使用 VisualStudio能够简化不少工做,不用程序员直接调用csc.exe等命令行进行程序的编译,并且VisualStudio提供了代码自动完 成、代码高亮等功能方便开发。除了VisualStudio,还有SharpDevelop、MonoDevelop等免费、开源的 IDE,VisualStudio Express版这个免费版本。

十一、Http默认的端口号是(80)、Ftp默认的端口号是(21)、SQLServer的默认端口号是(1433)

十二、谈谈你对设计模式的理解(须要丰富一下

世界上本没有模式,用的人多了,也就有了模式。不用刻意记每种模式的名字,手中无模式,心中有模式。

大部分设计模式就是接口、抽象类的一个组合。ADO.Net基于接口编程,SafeDbCommand、SafeConnection。SettingsProvider。不必记模式的名字。

1三、BS与CS的联系与区别。

C/S是Client/Server的缩写。客户端须要安装专用的客户端软件。

B/S是Brower/Server的缩写,客户机上只要安装一个浏览器。在这种结构下,用户界面彻底经过WWW浏览器实现,一部分事务逻辑在前端实现,可是主要逻辑在服务器端实现。浏览器经过Web Server 同数据库进行数据交互。

C/S 与 B/S 区别:

1).硬件环境不一样:

  C/S 通常创建在专用的网络上, 小范围里的网络环境, 局域网之间再经过专门服务器提供链接和数据交换服务. 

  B/S 创建在广域网之上的, 没必要是专门的网络硬件环境,例与电话上网, 租用设备. 信息本身管理. 有比C/S更强的适应范围, 通常只要有操做系统和浏览器就行

2).对安全要求不一样

  C/S 通常面向相对固定的用户群, 对信息安全的控制能力很强. 通常高度机密的信息系统采用C/S 结构适宜. 能够经过B/S发布部分可公开信息.

  B/S 创建在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

3).处理问题不一样

  C/S 程序能够处理用户面固定, 而且在相同区域, 安全要求高需求, 与操做系统相关. 应该都是相同的系统。C/S的客户端因为是本地程序,所以和本地硬件、程序的交互性很强,好比能够控制本机的其余程序、能够读写本地磁盘文件、能够与硬件交互。

  B/S 创建在广域网上, 面向不一样的用户群, 分散地域, 这是C/S没法做到的. 与操做系统平台关系最小,正应为如此B/S很难和本地硬件、程序、文件进行交互,好比很难控制本机的其余程序、很难读写本地磁盘文件、很难与硬件交互,固然能够用ActiveX技术解决,好比网银等就是这么解决的,这样作的问题就是可能会被客户拒绝,并且只局限于Windows操做系统。

C/S也分为两层架构和三层架构。两层架构:客户端程序程序直连数据库;三层架构:客户端访问服务端的服务,主要逻辑代码写在服务端的服务中,而后服务端服务再去访问数据库,Oracle版分布式呼叫中心,WCF。

14 说出一些经常使用的类、接口,请各举5个

要让人家感受你对.Net开发很熟,因此,不能仅仅只列谁都能想到的那些东西,要多列你在作项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。

经常使用的类:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List<T>

经常使用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary

要出乎意料!不要仅仅完成任务!

1五、.Net中会存在内存泄漏吗,请简单描述。 (*)

所谓内存泄露就是指一个再也不被程序使用的对象或变量一直被占据在内存中。.Net中有垃圾回收 机制,它能够保证一对象再也不被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。虽然.Net能够回收无用的对象,但 是.Net仍然存在因为使用不当致使的内存泄露问题。.Net中的内存泄露的状况:长生命周期的对象持有短生命周期对象的引用就极可能发生内存泄露,尽管 短生命周期对象已经再也不须要,可是由于长生命周期对象持有它的引用而致使不能被回收,这就是.Net中内存泄露的发生场景,通俗地说,就是程序员可能建立 了一个对象,之后一直再也不使用这个对象,这个对象却一直被引用,即这个对象无用可是却没法被垃圾回收器回收的,这就是.Net中可能出现内存泄露的状况, 例如,缓存系统,咱们加载了一个对象放在缓存中(例如放在一个全局Dictionary对象中),而后一直再也不使用它,这个对象一直被缓存引用,但却再也不 被使用。使用弱引用那么及时被引用也能够被回收。

formManager
{
  public static IList<Form> forms = new .....; 
}

1六、是否能够从一个static方法内部发出对非static方法的调用?

不能够。由于非static方法是要与对象关联在一块儿的,必须建立一个对象后,才能够在该对象 上进行方法调用,而static方法调用时不须要建立对象,能够直接调用。也就是说,当一个static方法被调用时,可能尚未建立任何实例对象,若是 从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪一个对象上的呢?这个逻辑没法成立,因此,一个static方 法内部不能发出对非static方法的调用。

1七、不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?StringBuilder与String的区别?

String是不可变的在这段代码中,s原先指向一个String对象,内容是 "abc", 而后咱们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另外一个 String对象, 内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量再也不指向它了。

String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。因此在大量字符串拼接或频繁对某一字符串进行操做时最好使用 StringBuilder,不要使用 String

    若是要操做一个不断增加的字符串,尽可能不用String类,改用StringBuilder 类。两个类的工做原理不一样:String类是一种传统的修改字符串的方式,它确实能够完成把一个字符串添加到另外一个字符串上的工做没错,可是在.NET框 架下,这个操做实在是划不来。由于系统先是把两个字符串写入内存,接着删除原来的String对象,而后建立一个String对象,并读取内存中的数据赋 给该对象。这一来二去的,耗了很多时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方 法,可以在已有对象的原地进行字符串的修改,简单并且直接。固然,通常状况下觉察不到这两者效率的差别,但若是你要对某个字符串进行大量的添加操做,那么 StringBuilder类所耗费的时间和String类简直不是一个数量级的。

1八、Server.Transfer和Response.Redirect的区别是什么?(不明白)

答: Server.Transfer仅是服务器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;Response.Redirect则是彻底的跳转,浏览器将会获得跳转的地址,并从新发送请求连接。这样,从浏览器的地址栏中能够看到跳转后的连接地址。

Server.Transfer是服务器请求资源,服务器直接访问目标地址的URL,把那个 URL的响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,因此它的地址栏中仍是原来的地址。 这个过程当中 浏览器和Web服务器之间通过了一次交互。

   Response.Redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址,通常来讲浏览器会用刚才请求的全部参数从新请求。这个过程当中浏览器和Web服务器之间通过了两次交互。

1九、DataReader和DataSet的异同?

DataReader使用时始终占用SqlConnection,在线操做数据库

每次只在内存中加载一条数据,因此占用的内存是很小的

是只进的、 只读的

DataSet则是将数据一次性加载在内存中.抛弃数据库链接..读取完毕即放弃数据库链接(非链接模式)

DataSet将数据所有加载在内存中.因此比较消耗内存...可是确比DataReader要灵活..能够动态的添加行,列,数据.对数据库进行 回传更新操做(动态操做读入到内存的数据)

20.请叙述const与readonly的区别。(*)

        const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。

        const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。由于它是在编译时就须要彻底评估。

        const成员可使用另外一个const成员来初始化,前提是二者之间没有循环依赖。

        readonly在运行期评估赋值,使咱们得以在确保“只读访问”的前提下,把object的初始化动做推迟到运行期进行。

        readonly 关键字与 const 关键字不一样: const 字段只能在该字段的声明中初始化。readonly 字段能够在声明或构造函数中初 始化。所以,根据所使用的构造函数,readonly 字段可能具备不一样的值。另外,const 字段是编译时常数,而 readonly 字段可用于运 行时常数。

  readonly 只能在声明时或者构造函数里面初始化,而且不能在 static 修饰的构造函数里面。

2一、什么是code-Behind技术。

就是代码隐藏,在ASP.NET中经过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的建立。好比分工,美工和编程的能够个干各的,不用再像之前asp那样都代码和html代码混在一块儿,难以维护。

一个ASP.NET页面通常都对应一个隐藏类,通常都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明以下

<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>

Codebehind="Tst1.aspx.cs" 代表经编译此页面时使用哪个代码文件

Inherits="T1.Tst1" 表用运行时使用哪个隐藏类

22.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增加的ID做为主键,注意:ID可能不是连续的。

答:解1: select top 10 * from A where id not in (select top 30 id from A)

解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

解答3:ROW_NUMBER(推荐)

 

2五、描述线程与进程的区别?(*)

 

1.线程(Thread)与进程(Process)两者都定义了某种边界,不一样的是进程定义的是应用程序与应用程序之间的边界,不一样的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。

 

2.一个进程能够包括若干个线程,同时建立多个线程来完成某项任务,即是多线程。而同一进程中 的不一样线程共享代码和数据空间。用一个比喻来讲,若是一个家庭表明一个进程,在家庭内部,各个成员就是线程,家庭中的每一个成员都有义务对家庭的财富进行积 累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也能够派出几个成员来协同完成,而家庭以外的人则没有办法直接消费不属于本身家庭的财 产。

 

加分的回答:举例,传智播客的.Net培训中用多线程(ThreadPool)实现网站蜘蛛的案例。

 

 加分的回答。

 

谈谈多线程:多线程不必定比单线程快,尤为是在进行I/O操做的时候,由于浪费了多线程切换的时间。多线程只是为了充分利用空闲的CPU,提升计算效率。

 

另外,多线程虽然不必定可以提升执行速度,可是至少能够避免界面卡死的问题,尤为对于Winform这类程序。

 

2六、什么是强类型,什么是弱类型?哪一种更好些?为何? 
C#中

 

int i=3;

 

i="a";

 

不能够

 

JavaScript中

 

var i=3;

 

i="a";

 

能够

 

强类型是在编译的时候就肯定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会肯定类型。

 

没有好很差,两者各有好处,强类型安全,由于它事先已经肯定好了,并且效率高。弱类型更灵活,可是效率低,并且出错几率高

 

通常用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等

 

加分的补充回答:引用传智播客.net培训呼叫中心项目中用强类型DataSet的例子,侃一通用强类型DataSet是多么方便。

 

 

 

2七、什么是反射?

 

程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它可以动态的建立类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时建立和使用类型实例

 

加分的补充回答:聊用反射实现编辑器动态插件和如鹏网项目中插件体系实现第三方支付和定时任务的案例。

 

 

 

2八、int、DateTime、string是否能够为null?

 

int、DateTime不能,由于其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null。string能够为null。

 

 

 

2九、using关键字有什么用?什么是IDisposable?

 

using能够声明namespace的引入,还能够实现非托管资源的释放,实现了IDisposiable的类在using中建立,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。

 

int?→Nullable<int>

 

 

 

30、Assembly.Load("foo.dll"); 这句话是否正确?(*)

 

错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll");

 

 

 

3一、XML 与 HTML 的主要区别

 

1. XML是区分大小写字母的,HTML不区分。

 

2. 在HTML中,若是上下文清楚地显示出段落或者列表键在何处结尾,那么你能够省略</p>或者</li>之类的结束 标记。在XML中,绝对不能省略掉结束标记。

 

HTML:<img src="1.jpg"><br><br>

 

XML:<img src="1.jpg"></img><br/><br/>

 

3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符做为结尾。这样分析器就知道不用 查找结束标记了。

 

4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。

 

5. 在HTML中,能够拥有不带值的属性名。在XML中,全部的属性都必须带有相应的值。

 

 

 

XML是用来存储和传输数据的

 

HTML是用来显示数据的

相关文章
相关标签/搜索