初步学习和了解结构体Struct的使用和原理
对于结构体,习惯于平时的编程习惯,数据存放和传输基本都是以类为单位,并没有使用过结构体,今天就特意来学习一下结构体是怎么回事
static void Main(string[] args)
{
MyStruct myStruct;
myStruct.A = "1";
Console.WriteLine(myStruct.A);
Console.ReadKey();
}
struct MyStruct
{
public string A;
public int B;
public double C;
public bool D;
public List<object> E;
public ArrayList Array;
}
上述代码中定义了一个结构体MyStruct,里面分别有6中不同类型的字段,并且在main方法中声明了结构体Mystruct,对其中的字符串字段A赋值并打印,其中体现了一个结构体的特别,
特点一:可以不使用New的方式来创建构造体
特别二: 结构体不能声明默认,也就是无参构造器,因为它是自动定义的,可以申明有参构造器,但是参数必须包含所有参数项
static void Main(string[] args)
{
MyStruct mystruct = new MyStruct();
Console.WriteLine("A={0}",mystruct.A);
Console.WriteLine("B={0}", mystruct.B);
Console.WriteLine("C={0}", mystruct.C);
Console.WriteLine("D={0}", mystruct.D);
Console.WriteLine("E={0}", mystruct.E);
Console.WriteLine("Array={0}", mystruct.Array);
Console.ReadKey();
}
struct MyStruct
{
public MyStruct(string a,int b ,double c,bool d,List<object> e,ArrayList array)
{
A = a;
B = b;
D = d;
C = c;
E = e;
Array = array;
}
public string A;
public int B;
public double C;
public bool D;
public List<object> E;
public ArrayList Array;
}
代码中可以看出结构体类创建了一个有参构造函数,参数包含了所有结构体类的字段,如果没有包含就会报在控制调用返回方法之前,某某字段没有被赋值的错误;
代码中使用结构体时并没有使用有参构造函数,也没有对结构体中的字段赋值就直接可以使用,打印的结果如下
A=
B=0
C=0
D=False
E=
Array=
在有有参构造函数的时候,调用无参构造函数创建结构体,结构体会给所有字段赋予一个默认值,这就类似于全局变量在声明时没有赋值,就会被赋予一个默认值一样,虽然没有了解过全局变量为什么会被赋予默认值,或许可能也许就是这个原因吧?
因为结构体是值类型的数据,也就是说他和基本类型数据是一样的,比如int类型,代码转定义的话就可以看到
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32>
Int32是被struct修饰的,是不是可以说这个Int32也是结构体呢?并且它实现了多个接口,却没有继承一个类,当然object不算啊,开个玩笑,这就出来结构体的另一个特点了
特点三:结构体可以实现一个或多个接口,但无法继承其他结构或者类,也无法被其他类继承
其他特点:结构成员不能指定为 abstract、virtual 或 protected。
这应该还是很好理解的,因为不能被继承,就不能谈被继承后的实现和重写了,所以当然不能被修饰为抽象Abstract和虚拟Vietual,至于protected,因为被这个修饰的就只能在本类和本类的子类中被访问,由于结构不能被继承,那么就只能在本类中访问,只能在本类中访问那就是私有,private修饰的就是私有,这两者就冲突重复了,所以private胜出,当然这只是我的理解,因为不能被继承,那么不能被继承相关的修饰词修饰这样理解也没错吧?
除了以上的特点外,就目前来说,结构和类的使用是差不多的,结构体里面可以包含方法、字段、索引、属性、运算符方法和事件。
还有一点,结构体不能被static
由于结构体是值类型,值类型的数据是在栈空间中,而类是引用类型,数据是在堆空间中,数据引用在栈空间中
值类型数据在获取数据时直接在栈空间中就可以拿出数据,而引用类型的数据是在栈空间中找到引用的堆空间的地址,再用这个地址去堆中拿出数据,比值类型要多出去堆空间拿数据的步骤,所以值类型的数据获取会比应用类型的获取快,这是不是意味着用结构存储数据传递就一定好呢?
对比一下栈和堆的大小就知道了:
测试栈空间的大小
栈的空间是有限制的,文章最后提到一般系统默认设置栈段为8M、4M、2M或1M,这么看起来很小啊,而堆的空间呢?理论上可以无限大,那就可以看出一些问题了,如果我们用来传输数据和保存数据的结构体数据量过大的话会有什么后果?栈不够用,不够用就会数据丢失,所以在实际应用中,结构体适合作为一种可以整合多种并总量较小数据的集合用来传递使用,可以一定程度的加快速度和提供便捷。如果是储存的话,还是用类吧。