.Net面试相关(一)

136 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

System.Object

// member function
virtual bool Equals(object obj);
virtual int GetHashCode(object obj);
Type GetType();
virtual string ToString();

// public static method
bool Equals(object objA, object objB);
bool RefernceEquals(object objA, object objB);

// protected
object MemberwiseClone();
Finalize

Object存在三个虚方法,使用virtual修饰

class a{
    public virtual string hello(){
        Console.WriteLine("This is a hello")
    }
}

class b{
    public override void hello() // 注意override ,表明重新实现了虚函数
    {
        Console.WriteLine("This is b hello");
    }
}

a a1 = new b();
a1.hello() // 输出"This is b hello" 一定要使用override修饰

值类型和引用类型的区别

  • 内置类型(继承自System.ValueType)都是值类型,结构体也是值类型,其他类型都是引用类型
  • 赋值:值类型会产生一个数据副本,而引用类型是直接赋值引用
  • 内存分配:值类型在stack上,引用类型在heap上
  • 比较:内容比较,引用比较

什么是装箱和拆箱

  • 值类型->引用类型:装箱 栈->堆
  • 引用类型->值类型:拆箱 堆->栈,拆箱限检测类型是否一致,如果不一致发生InvalidCastException

装箱和拆箱对性能的影响

  • 装箱和拆箱都意味着堆和栈上的空间的一系列操作,这些操作的性能代价是很大的。尤其是对于堆上的空间操作,速度要比栈上慢的多,并且可能引发垃圾回收,这些都大规模影响系统的性能。
  • 为避免操作浪费性能,应该要
    1. 格式化输出
    2. 使用泛型类的List,而不使用ArrayList

C#中的方法的参数有几种传递方式

  • 一共有三个可选关键字修饰方法的参数:ref ,out,params。
  • ref和out参数都是引用传递,区别在于ref要求参数在传入前初始化,out参数要求参数要在方法返回前初始化
  • params实现了参数数目可变的方法

C#中是否有全局变量

  • C#没有传统意义的全局变量,但是并不代表不能定义一个全局可见的变量,最常用的是公共静态变量

struct和class的区别

  • struct的是值类型,class是引用类型
  • struct不支持继承,不能定义无参结构方法,不能在定义时赋值。
  • struct默认public,class默认private
  • 结构作为一个微型的值类型的“类”,常用语储存数据,没成员函数的类