本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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
装箱和拆箱对性能的影响
- 装箱和拆箱都意味着堆和栈上的空间的一系列操作,这些操作的性能代价是很大的。尤其是对于堆上的空间操作,速度要比栈上慢的多,并且可能引发垃圾回收,这些都大规模影响系统的性能。
- 为避免操作浪费性能,应该要
- 格式化输出
- 使用泛型类的List,而不使用ArrayList
C#中的方法的参数有几种传递方式
- 一共有三个可选关键字修饰方法的参数:ref ,out,params。
- ref和out参数都是引用传递,区别在于ref要求参数在传入前初始化,out参数要求参数要在方法返回前初始化
- params实现了参数数目可变的方法
C#中是否有全局变量
- C#没有传统意义的全局变量,但是并不代表不能定义一个全局可见的变量,最常用的是公共静态变量
struct和class的区别
- struct的是值类型,class是引用类型
- struct不支持继承,不能定义无参结构方法,不能在定义时赋值。
- struct默认public,class默认private
- 结构作为一个微型的值类型的“类”,常用语储存数据,没成员函数的类