类型语法基础和内存管理基础

一:基础类型和语法

1.1 .net中所有类型的基类是什么:

  在.net中所有的内建类型都继承System.Object类型。C#中编译器自动添加继承申明

  public class A{}

  public class A:System.Object{}

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

  .net中分值类型和引用类型,都继承自System.Object,区分标准是否继承System.ValueType(继承自System.Object),

  继承自System.VauleType的类型的是值类型(整型,浮点,布尔,结构,枚举),其他的都是引用类型(class)。

  PS:严格来说,System.Object作为所有内建类型的基类,本身没有值类型和引用类型之分。new的System.Object对象有引用类型的特点。

    这就是值类型在某些场合需要拆箱装箱的原因。

  (1):赋值时的区别

       值类型:直接获得数据副本

       引用类型:把对象的引用赋值给变量(多个变量可以引用到一个对象实例上)

  (2):内存分配的区别

       值类型:对象会在堆栈上分配内存(空间有限,运行效率高)

       引用类型:对象会在堆上分配内存

  (3):继承结构区别

       值类型的比较方法:Equals

 1.3 装箱和拆箱的原理

  (1)装箱:CLR把堆栈上的值类型移动到堆上

  (2)拆箱:堆中的对象复制到堆栈中,并返回其值

    PS:这种操作性能代价很大的,尤其是堆栈上空间上的消耗,并且会触发垃圾回收,大规模形象系统的性能。

    避免拆装箱:

    (1)值类型的格式化输出

        int i = 10;

        Console.WriteLine(i.ToString());

    (2)System.Object类型的容器,使用泛型技术

        ArrayList  arrList = new ArrayList();

        arrList.Add(0);

        arrList.Add("1");

        改为:

        List<int> intList = new List<int>();

        intList.Add(0);

        intList.Add(1);

 1.4 struct和class的区别,struct适用于那些场合

  首先,struce是值类型分配在堆栈上,而class是引用类型分配在堆上。

  然后,struct不具有继承特性,虽然可以重新定义在System.Object的虚方法,但是不能定义新的虚方法和抽象方法。

  最好,struct不能有无参数的构造方法(class默认就有),也不能为成员变量定义初始化。

  public struce A

  {

    public int a = 1;  //编译不通过

  }

 1.5 C#中方法的参数传递方式

  (1)ref关键字:引用传递参数,需要在传递前初始化

  (2)out关键字:引用传递参数,需要在传递前初始化

  (3)params关键字:允许方法在定义时不确定参数的数量,当一个方法神明了params参数后,就不允许后面有任何其他参数

 1.6 浅复制和深复制区别

  (1)浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。

  (2)深复制:复制一个对象的时候,不仅复制所有的非类型成员,还要复制所有引用类型成员的实际对象。

二:内存管理和垃圾回收

  2.1.net中栈和堆的差异

    (1).net中的堆栈

       用来存储值类型的对象和引用类型对象的引用,其释放按照FILO逻辑

       TempClass a = new TempClass();  //TempClass是引用类型,有两个整型的int成员。

       a.numA = 1;            //当a的作用域结束之后,三个按照a.numB -> a.numA ->a的顺序退栈

       a.numB = 2;

    (2).net中的拓展堆

    (3).net中的非拓展堆

  2.2 string abc = "aaa"+"bbb"+"ccc";共分配了多少内存

    2.3简要说说,net中的GC运行机制

     (1)找到所有不再被使用的对象,标记为垃圾,腾出空间内存

     (2)移动仍在使用的对象

  2.4 Dispose和Finalize

   (1)Dispose方法,依赖类型的使用者

      [ComVisible(true)]

      public interface IDispoable

      {

        void Dispose();
      }
   (2)Finalize()

  

        

猜你喜欢

转载自www.cnblogs.com/HansZimmer/p/9350863.html