C#笔试面试知识点整理(吐血整理)

一、接口可以包含方法、属性、事件、索引器或这四种成员类型的任意组合。 接口不能包含常量、字段、运算符、实例构造函数、终结器或类型。 接口成员会自动成为公共成员,不能包含任何访问修饰符。 成员也不能是静态成员。若要实现接口成员,实现类的对应成员必须是公共、非静态,并且具有与接口成员相同的名称和签名。
接口既不能有构造函数(如何构建不能实例化的对象?)也不能有字段(因为这隐含了某些内部的实现方式)。
二、类和结构体的区别
1、结构与类的区别是他们在内存中的存储方式、访问方式(类是存储在堆(heap)上 的引用类型,而结构是存储在栈(stack)上的值类型)。 较小的数据类型使用结构可提高性能。 但在语法上,结构与类非常相似,主要的区别是使用关键字 Struct代替 Class来声明结构。
2、结构的一个限制是不支持继承,但每个结构都派生自System.ValueType.结构不能实现类型层级的结构,但结构可以实现接口。换言之,结构并不支持继承,但支持接口继承。而类可以派生自另一个类和任意多个接口。
事实上定义结构和类可以总结为:
结构总是派生自Sytem.ValueType,它们还可以派生自任意多个接口
类总是派生自用户选择的另一个类,它们还可以派生自任意多个接口
3、结构体派生自ValueType,ValueType派生自Object,可访问Object的方法
结构体的默认构造不能显示给出,不然编译器会报错,当类有自定义的构造函数时,默认构造会被隐藏,要想使用默认构造,必须显示给出;结构体的自定义构造函数必须初始化所有的实例字段和未初始化的属性,而类不必。结构体默认的构造函数是自动定义的,且不能被改变。
4、在结构体中可以声明字段,但是声明字段的时候是不能给初始值的。类中声明1个字段的同时给这个字段赋初始值,
5、创建结构体对象可以不使用new关键字.直接声明1个变量就可以.但是这样的话,结构体对象中的字段是没有初始值的,所以在使用字段之前必须要为这个字段赋值.
原因很简单.因为声明的时候就不能给初始值,虽然构造函数中为对象的字段赋值,但是此种方式创建结构体对象,没有调用构造函数,所以必须要程序员在使用之前手动赋值。
另外1种创建结构体对象的方式和类一样,使用new关键字来创建,与不使用new关键字创建不同的是,通过使用new关键字创建结构体对象后,这个结构体对象的字段就已经有值了.原因不难理解,new关键字调用了构造函数,而结构体构造函数要求必须要为所有的字段赋值.
三、C#默认的修饰符
1、直接声明在命名空间下的类和结构体,默认是internal的
2、类和结构体的成员,包括内嵌的类和结构体,默认是private的
3、接口默认是internal的
4、enum的成员是public的访问权限
5、类的成员,默认是private的访问权限
6、接口的成员,默认是public的访问权限
7、结构体的成员,和class类似,默认的访问权限也是private的
四、基类和子类构造函数的执行顺序
1、当实例化一个子类时,父类以及子类的变量和构造函数的执行顺序如下:
01子类的静态变量->02子类的静态构造函数->03子类的变量->04父类的静态变量(此时因为要执行子类的构造函数,会与父类发生关系)->05父类静态构造函数->06父类变量->07父类构造函数->10子类构造函数->结束。

 class A
 {
      public A()
      {
          PrintFields();
      }
      public virtual void PrintFields() { }
  }
  class B : A
  {
      int x = 1;
      int y;
      public B() { y = -1; }
      public override void PrintFields()
      { Console.WriteLine("x={0},y={1}", x, y); }

  }

new B()输出结果为 x=1,y=0;
首先初始化子类变量 x=1,y=0;
调用基类构造函数A() A调用了函数PrintFields() 由于是虚函数调用子类的PrintFields()
由于B的构造函数还没开始执行
于是输出 x=1,y=0;
五、C#访问修饰符
C#笔试面试知识点整理(吐血整理)_第1张图片
六、ASP.Net中页面传值的几种方式
大致概括一下,ASP.NET 页面之间传递值得方式大致可以分为如下几种:Request.QueryString[“name”],Request.Form(“name”),Session,Cookie,Cache,Application,Server.Transfer,Database,HttpContext的Item属性,Files,DataBase等等。
七、线程和进程的主要区别
(1)进程是操作系统资源分配的基本单位,而线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(**同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)),一个进行至少包括一个线程。
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
(3)线程与进程的区别可以归纳为以下4点:
1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,进程不是一个可执行的实体。

你可能感兴趣的:(C#基础,易混淆)