码迷,mamicode.com
首页 > Web开发 > 详细

.net 中struct(结构)和class(类)的区别

时间:2017-04-10 19:44:28      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:hstp   osc   cst   ann   tar   xfs   adf   iic   ora   

1、struct 结构与class(类)的区别

1)struct是值类型,class是对象类型

2)struct不能被继承,class可以被继承

3)struct默认访问权限是public,而class默认是private

5) struct不能由程序员申明构造函数,有编辑器自动生成,用于描述轻量级对象,执行效率高,例如:Line,Point等

6)struct的new和class的new是不同的,struct的new就是执行一下构造函数创建一个实例,再对所有字段进行复制。

而class则是在堆上分配一块内存再执行构造函数,struct内存并不是在new的时候分配的,而是是定义的时候分配。

7)struct 可以不用new来实例化,而类却要,如果struct不用new来实例化,那么结构的所有字段处于未分配状态。

2、验证struct和class的区别

1)struct是否可被class继承

 /// <summary>
    /// 定义一个结构
    /// </summary>
    struct WinPoint {
       public int Left;
       public int Right;
    }
    /// <summary>
    /// 定义一个类
    /// </summary>
    class TestClass: WinPoint
    {
        public int Left;
        public int Right;
    }

这样,TestClass类继承结构是不行的,编译时报错如下

技术分享

2)struct是否可被struct继承

   /// <summary>
    /// 定义一个结构
    /// </summary>
   public  struct WinPoint {
       public int Left;
       public int Right;
    }

    /// <summary>
    /// 再定义一个结构
    /// </summary>
   public struct WinPoint1: WinPoint
   { 
        
   }

struct不能被另一个struct继承,编译时报错如下:

技术分享

3)class是否可被class继承

    /// <summary>
    /// 定义一个父类
    /// </summary>
    public class TestClass
    {
        public int Left;
        public int Right;
    }

    /// <summary>
    /// 定义一个子类,继承父类属性
    /// </summary>
    public class TestClass1 : TestClass { 
      
    }

在使用的时候,可以调用父类的属性

 public void TestClick(){
            TestClass1 test1 = new TestClass1();
            test1.Left = 10;
            test1.Right = 20;
        }

4)struct在方法传递是否是副本

类和结构的创建

/// <summary>
    /// 定义一个结构
    /// </summary>
    public struct TheStruct {
       public int Left;
       public int Right;
    }

    /// <summary>
    /// 定义一个类
    /// </summary>
    public class TheClass {
        public int Left;
        public int Right;
    }

    public class TestClass {

        /// <summary>
        ///赋值方法(结构)
        /// </summary>
        /// <param name="thestruct"></param>
        public static void StructTaker(TheStruct thestruct) {
            thestruct.Left = 20;
            thestruct.Right = 30;
        }

       /// <summary>
       /// 赋值方法(类)
       /// </summary>
       /// <param name="theclass"></param>
        public static void ClassTaker(TheClass theclass) {
            theclass.Left = 20;
            theclass.Right = 30;
        }
    }

调用的方法

  private void btnTest_Click(object sender, EventArgs e)
        {
            //创建一个机构实例对象
            TheStruct stu = new TheStruct();
            //赋初始值
            stu.Left = 1;
            //创建一个类实例对象
            TheClass cla = new TheClass();
            cla.Left = 1;
            //重新给机构和类赋值
            TestClass.StructTaker(stu);  //调用方法,重新设置为20
            TestClass.ClassTaker(cla);   //调用方法,重新设置为20
            //输出结构
            MessageBox.Show("结构stu.Left:"+stu.Left+",类cla.Left:"+cla.Left);
        }

最后的弹出结果,如下图

技术分享

刚开始都初始化为Left的值为1,重新赋值为20时,机构的Left没有改变,类的Left改变了,这就证明当一个结构传递到一个方法时,被传递的只不过是一个副本,

而一个类被传递,被传递是一个引用对象地址。

参考网址:

http://www.cnblogs.com/tonytonglx/articles/2080470.html

 

.net 中struct(结构)和class(类)的区别

标签:hstp   osc   cst   ann   tar   xfs   adf   iic   ora   

原文地址:http://www.cnblogs.com/xielong/p/6690244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!