Struct还是Class?

2 篇文章 0 订阅

看到这么个标题,首先我们可以不用去想C或者Java。他们俩都没有这个麻烦。

当C开始过渡走向C++的时候,class出现了,struct当然也还在,不过strut已然不是当年的它了。记得去年读C++编程思想的时候,发现所有的类都是struct很是吃惊,看官尽可笑话在下没见过世面,不过一个疑问瞬间诞生了:区别呢?

##C++的区别很简单,我们就不要追究了,二者的区别仅在于struct默认成员都是共有的,而class则默认是私有的。(Java默认居然是default,前几天看到程序员面试宝典上面居然说默认是protected,不过还是有些差异,尽管你完全不必理会它。)

##下面就来测试一下C#。

    struct TypeStruct
    {
        string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

    class TypeClass
    {
        string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
          private void btn_Click(object sender, RoutedEventArgs e)
        {
            TypeClass clz = new TypeClass();
            TypeStruct stc = new TypeStruct();

            clz.Name = "type class";
            stc.Name = "type struct";

            Console.WriteLine("class before changed:" + clz.Name);
            Console.WriteLine("struct before changed:" + stc.Name);


            changeClass(clz);
            changeStruct(stc);

            Console.WriteLine("class after changed:" + clz.Name);
            Console.WriteLine("struct after changed:" + stc.Name);
        }

        private void changeStruct(TypeStruct ts)
        {
            ts.Name = "type struct changed";
            Console.WriteLine(ts.Name);
        }

        private void changeClass(TypeClass tc)
        {
            tc.Name = "type class changed";
            Console.WriteLine(tc.Name);
        }

因为我的工程是wpf工程,所以用了一个按钮触发。我本来以为就像C++说的那样,struct里面的成员默认是公有的,哦,我错了,我试图写出stc.name这样的代码去访问name属性,不可以。

那么看看输出结果:

class before changed:type class
struct before changed:type struct
type class changed
type struct changed
class after changed:type class changed
struct after changed:type struct


好的,如果是class的实例,我们发现在函数当中修改对象的值,会影响外部的对象。也就是说class的对象是引用性,函数传入的是对象的引用,而不是对象的副本。

struct却就像int这样的内建类型一样只传了一个对象的副本进去,正是值传递的意思。实际上,如果从语法表面上讲,C#的struct就是C++的struct的内部版本,因为除了内部的成员默认是外部不可访问的,其他用法似乎很像。(试想一下,C++里面的struct也好,class也好,如果不传指针或者引用的话,会不会是直接传入对象的值拷贝?)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值