C# 结构是值类型

虽然结构是值类型, 但是在语法上常常可以把它们当做类来处理。 例如:

public struct Dimensions
{
    public double Length {get; set;}
    public double Width {get; set;}
 
    public Dimensions(double length, double width)
    {
        Length = length;
        Width = width;
    }
 
    public double Diagonal()
    {
        return Math.Sqrt(Length * Length + Width * Width);
    }
}

// 下面看下如何调用

// 方法1
var point = new Dimensions(length: 3, width: 6);
Console.WriteLine( point.Diagonal() );

// 方法2
var point = new Dimensions();
point.Length = 3;
point.Width = 6;
Console.WriteLine( point.Diagonal() );

// 方法3
Dimensions point; 
point.Length = 3;
point.Width = 6;
Console.WriteLine( point.Diagonal() );


看调用方法3 如果是类,就会产生一个编译错误,因为point 是一个没有初始化的引用,不指向任何地方的一个地址,所以不能给其字段赋值。 但是对于结构,变量声明实际上是为整个结构在栈中分配空间,所以就可以为它赋值了。

结构遵循其他数据类型都遵循的规则:在使用前所有的元素都必须进行初始化。在结构上调用 new 运算符,或者给所有的字段分别赋值, 结构就完全初始化了。 当然,如果结构定义为类的成员字段, 在初始化时,该结构会自动初始化为0。

结构是会影响性能的值类型,但根据使用结构的方式,这种影响可以是正面的,也可能是负面的。 正面的影响是为结构分配内存时,速度非常快, 因为它们将内联或者保存在栈中。 在结构超出了作用域被删除时,速度也很快,不需要等待垃圾回收。负面的影响是,只要把结构作为参数来传递或者把一个结构赋予另一个结构(如 A=B, 其中 A和B是结构), 结构的所有内容就被复制,而对于类,则只复制引用。 这样就会有性能损失,根据结构的大小,性能损失也不同。 注意,结构主要用于小的数据结构。

注意:当把结构作为参数传递给对方时, 应把它当做 ref 参数传递, 以避免性能损失, 此时只传递了结构在内存中的地址, 这样传递速度就与在类的传递速度一样快了, 但如果这样做,就必须注意被调用的方法可以改变结构的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值