c#基础 疑难杂症(持续更新中)

前言:

  身处IT行业,最尴尬的情况莫过于面试或者考试的时候答不上来,以下是平日里遇到的一些常见的问题,记录一下!

 

一、什么是值类型?什么是引用类型?拆箱?装箱?装箱三步曲?

答:值类型:基元类型(int、float等)、枚举、结构,值存放在栈中,顺序存储

  引用类型:string、数组、object、类对象等,值存放在堆中,引用对象也占一块内存,指向值的地址

  拆箱:把引用类型转换成值类型
  装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。
( 1 )第一步:新分配托管堆内存 ( 大小为值类型实例大小加上一个方法表指针。
( 2 )第二步:将值类型的实例字段拷贝到新分配的内存中。
( 3 )第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了

 

二、数组跟列表有什么区别?

答:数组:长度固定,类型统一,可为空
  列表:长度可变(初始为10),类型可变,不可为空

三、哈希表跟字典的区别?

答:哈希表:不用拆装箱、线程不安全

  字典:需要拆装箱,线程安全

四、ref跟out有何不同?

答:ref :参数需要初始化才能被函数使用,在方法内方法外都可以使用

  out:无需初始化,只能在方法外调用

  用处:用来将方法内对形参赋值后的结果传递出来


五、虚函数重写跟覆盖?重载又是什么?

答:重写:子类可以调用自己的方法

  覆盖:子类的方法被父类覆盖,子类调用该方法实际上还是调用子类的方法

  重载:多个方法共用一个方法名,方法之间参数类型跟数量不同

 

六、堆跟栈有什么区别?

答:堆:无序的,他是一片不连续的内存域,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC) 来回收

  栈:先进后出,他是一片连续的内存域,有系统自动分配和维护

七、类成员加上static修饰符有什么作用?

答:静态成员:在定义的时候就已经占用了空间,而且只占据一块内存,当某个地方改变是,全局可见,属于类成员

  非静态成员:在类的对象实例化时创建,创建多少个对象,就开辟了多少空间来存放自己的非静态成员,属于对象成员

 

八、垃圾回收机制(GC)?托管跟非托管资源?

答:垃圾回收机制主要是针对堆。值类型在使用完后会自动释放,但是引用类型不会,所以需要靠GC来管理托管堆内存。

  处于堆里的内存即是托管资源

 

九、partial修饰符有什么作用?

答:Partial是分部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中

  如果一个类型有一个部分使用了abstract修饰符,那么整个类都将被视为抽象类

十、委托?事件?

答:委托:专业一点来说,委托的作用就是为了代码的可扩展性,将方法当做参数动态传递

  事件:一种特殊的委托,相当于对委托做了封装处理(仅对注册方法开放)

 

十一、const跟readonly有什么区别

答:

1) 、初始化位置不同。 const 必须在声明的同时赋值; readonly 即可以在声明处赋值,也可以在构造函数中赋值 ;
2 )、修饰对象不同。 const 即可以修饰类的字段,也可以修饰局部变量; readonly 只能修饰类的字段
3 )、 const 是编译时常量,在编译时确定该值; readonly 是运行时常量,在运行时确定该值。
4 )、 const 默认是静态的;而 readonly 如果设置成静态需要显示声明
5 )、修饰引用类型时不同, const 只能修饰 string 或值为 null 的其他引用类型; readonly 可以是任何类型。

十二、基元类型的有符号数跟无符号数的区别?

答:有符号数的最高位是符号位,0则表示正数,1则表示负数。

举个例子:byte类型的 86H,二进制为:1000 0100 ,十进为:byte则表示 2^7+4= 132,sbyte则表示 - 2^7+4= -124.

因此,表示范围是一样,字节长度也是一样的,但是无符号没有负数,所以是两倍。

 

十三、for跟foreach有什么区别?

答:for:通过索引器遍历、循环体内值可变。

foreach:通过迭代器遍历、循环体内值不可变、语法更简单、效率更高。

注意:不是任何场景都要用foreach,因为foreach不支持在内部改变集合的值

 

十四、特性能不能被继承?

答:可以,特性中的属性也属于类的一部分,理所应当会被继承

 

十五、string类型为什么是引用类型?

            string str = "aaa";
            string str1 = str;
            str = "bbb";        
      // 输出为
      str=“bbb”;
      str1 = “aaa”;

答:经过以上代码测试,很容易看出string具有值类型的特征,str的值改变了,但是str1还是指向原来的地址,但是

 

posted @ 2022-12-06 20:50  Darius丶段  阅读(95)  评论(0)    收藏  举报