c#中的结构

在c#中,结构与类非常相似,只要掌握好类的使用,使用结构就变得非常简单,下面对结构进行简单介绍。

1.定义结构

下面代码首先定义一个类

    class Person
    {
        public string Name{get;set;}
        public int age { get; set; }
        public int height { get; set; }
        public double weight { get; set; }
        public string country { get; set; }
    }


这已经非常熟悉了,下面来定义一个结构

    struct SPerson
    {   
	public string Name { get; set; }
        public int age { get; set; }
        public int height { get; set; }
        public double weight { get; set; }
        public string country { get; set; }
    }


我们发现唯一的区别就是类的定义使用“class”关键字,而结构使用“struct”关键字。

这只是表面上的不同,下面介绍起具体的不同点

2 类与结构的区别

1)构造函数

类中可以覆盖默认无参构造函数,代码如下

    class Person
    {
        public Person(){}
    }

结构中只能定义新的构造函数,如果象上面那样覆盖无参构造函数,则会报错“ 结构不能包含显式的无参数构造函数”。

但是在结构中可以定义新的构造函数,如下所示

struct SPerson        
    {
        //public SPerson() { }
        public SPerson(string xname, int xage):this()
        {
            Name = xname;
            Age = xage;
        }
    }

大家会发现,和类中定义构造函数还是有所不同的,定义时加上了了:this(),如果不加this会有什么结果呢?编译器会报错“必须对自动实现的属性“结构.SPerson.所有属性名称”的支持字段完全赋值,才能将控制返回给调用方。请考虑从构造函数初始值设定项中调用默认构造函数”和“在给“this”对象的所有字段赋值之前,无法使用该对象”,关于错误的具体原因,可以参考如下链接http://www.cnblogs.com/cuitsl/archive/2011/08/22/2149896.html,这里就不详细阐述了。

2)字段不能初始化

我们可以在类中定义字段,并定义初始值

private string color = "黄色";

 

这行代码若放在结构中,则会报错"结构中不能有实例字段初始值设定项".。但是如果字段被声明称const(常量)或者static(静态),则可以为其初始化。

3)结构是值类型,类是引用类型

类是引用类型,类的对象存储在堆中,结构是值类型,存储在栈中,这就意味着,在将一个类对象赋值给另外一个变量时,是引用传递,而将结构对象赋值给另外一个变量时则是复制传递。看下面的代码

Person p1 = new Person();
p1.Name = "yhb";
Console.WriteLine(p1.Name);
Person p2 = p1;
p2.Name = "bhy";
Console.WriteLine(p1.Name);


首先声Person类的一个实例p1,然后为p1的Name属性赋值,然后将p1赋值给另外一个Person类型的变量p2,然后更改p2中Name属性的值,通过输出结果可以发现对象p1中Name属性的值也变化了。这就是引用传递,Person类型的变量p1和p2其实指向的同一个Person实例

如果将上面的代码改成结构呢?

SPerson sp = new SPerson();
sp.Name = "yhb";
Console.WriteLine(sp.Name);
SPerson sp1 = sp;
sp1.Name = "bhy";
Console.WriteLine(sp.Name);

观察最后的输出结果,发现sp.Name的值并没有随着sp1.Name的改变而改变,这就是值传递的特点-复制传递:在将sp对象赋值给sp1时,其实是复制了一份给sp1。无论改变哪个,另外一个都不会受到影响。

4.结构不能被继承,可以把结构看成密封类(sealed)
5.使用结构的情形

首先确定一点,使用结构可以完成的功能,都可以通过类来实现,只有在使用轻量级数据时,我们才考虑使用结构,不严谨的说就是在类中的成员不是很多,且创建结构后就不再修改数据,这时候就可以考虑使用结构。


 


 


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴山却话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值