简述
struct属于值类型,class属于引用类型
存储地址
struct储存于栈,class储存于堆(class于栈中储存引用)
传参性质
struct属于值传递,在函数内对参数进行修改,不会修改struct
class处于引用传递,在函数内对参数进行修改,会修改class
注:若想令struct具有引用传递的特性,可利用ref关键字(reference 引用)
示例代码
不使用ref关键字:
internal class Program
{
static void Main(string[] args)
{
X x = new X();
add(x);
Console.WriteLine("跳出add方法后,num的值为:" + x.num);
}
public static void add(X x)
{
x.num += 1;
Console.WriteLine("在add方法中,num的值为:" + x.num);
}
}
public struct X
{
public int num = 1;
public X()
{
}
}
使用ref关键字(声明函数与传入参数时均需要添加ref关键字):
internal class Program
{
static void Main(string[] args)
{
X x = new X();
//传入参数时需要添加ref关键字
add(ref x);
Console.WriteLine("跳出add方法后,num的值为:" + x.num);
}
//声明函数时需要添加ref关键字
public static void add(ref X x)
{
x.num += 1;
Console.WriteLine("在add方法中,num的值为:" + x.num);
}
}
public struct X
{
public int num = 1;
public X()
{
}
}
所以需要注意,并不是给struct添加ref关键字
继承规则
struct默认继承于Object类,class若无显式基类,也继承于Object类
struct无法继承struct与class,但可实现数个interface
public struct x : interface_1,interface_2,interface_3
class至多可继承一个class,无法继承struct,也可实现数个interface,但是基类需要排在所有interface之前
public class x : class_1,interface_1,interface_2
构造函数
若struct具有已初始化的字段,则必须显式声明构造函数(即使是空函数),而class不需要
public struct x
{
int num = 1;
public x()
{
}
}