zoukankan      html  css  js  c++  java
  • 转载 C#结构体(struct)和类(class)的区别

    转载原地址: http://dotnet.9sssd.com/csbase/art/8

    C#结构体和类的区别问题:在C#编程语言中,类属于引用类型的数据类型,结构体属于值类型的数据类型,这两种数据类型的本质区别主要是各自指向的内存位置不同。传递类的时候,主要表现为是否同时改变了源对象。

    C#结构体和类的区别技术要点:
    ◆类在传递的时候,传递的内容是位于托管内存中的位置,结构体在传递的时候,传递的内容是位于程序堆栈区的内容。当类的传递对象修改时,将同时修改源对象,而结构体的传递对象修改时,不会对源对象产生影响。
    ◆在一个类中,可以定义默认的、不带参数的构造函数,而在结构体中不能定义默认的、不带参数的构造函数。两者都可以定义带有参数的构造函数,通过这些参数给各自的字段赋值或初始化。

    C#结构体和类的区别之实现步骤:
    (1)创建控制台应用程序项目,命名为“ClassAndStruct”。
    (2)打开并编辑Program.cs文件,代码如下所示。

    using System;   //C#结构体和类的区别
    using System.Collections.Generic;
    using System.Text;
     
    namespace ClassAndStruct
    {
        class Program
        {
            static void Main(string[] args)
            {
                //使用带参数的构造函数创建员工类的实例   
                classEmployee clsEmpA = new
                classEmployee("Pony", "Smith", 43);
     
                classEmployee clsEmpB = clsEmpA;
     
                //修改引用数据   
                clsEmpB.Age = 33;
     
                //使用带参数的构造函数创建员工结构体的实例
                structEmployee strctEmpA =
                new structEmployee("Pony", "Smith", 43);
     
                structEmployee strctEmpB = strctEmpA;
     
                //修改   
                strctEmpB.Age = 33;
     
                Console.WriteLine("类的数据:姓名-{0} {1} 年龄-{2}",
                clsEmpA.FirstName, clsEmpA.LastName, clsEmpA.Age);
                Console.WriteLine("结构体的数据:姓名-{0} {1} 年龄-{2}",
                strctEmpA.FirstName, strctEmpA.LastName, strctEmpA.Age);
                Console.ReadLine();
            }
        }
     
        class classEmployee//表示员工的类   
        {
            private string firstname;
     
            public string FirstName
            {
                get { return firstname; }
                set { firstname = value; }
            }
     
            private string lastname;
     
            public string LastName
            {
                get { return lastname; }
                set { lastname = value; }
            }
     
            private int age;
     
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
     
            //类的默认构造函数,可以在类中重新定义   
            public classEmployee()
            {
                firstname = "";
                lastname = "";
                age = 0;
            }
            //C#结构体和类的区别
            //类的带参数的构造函数,在构造类实例的同时给字段赋值   
     
            public classEmployee(
                string strFirstNamem, string strLastName, int iAge)
            {
                firstname = strFirstNamem;
                lastname = strLastName;
                age = iAge;
            }
        }
     
        struct structEmployee//表示员工的结构体   
        {
            private string firstname;
     
            public string FirstName
            {
                get { return firstname; }
                set { firstname = value; }
            }
     
            private string lastname;
     
            public string LastName
            {
                get { return lastname; }
                set { lastname = value; }
            }
            //C#结构体和类的区别
            private int age;
     
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
     
            //在结构体中不能定义默认的不带参数的构造函数,只能定义结构体的带参数的构造函数   
            public structEmployee(string strFirstNamem, string strLastName, int iAge)
            {
                firstname = strFirstNamem;
                lastname = strLastName;
                age = iAge;
            }
        }
    }

    (3)按F5键运行程序,运行结果如下所示。
    类的数据:姓名-Pony Smith 年龄-33
    结构体的数据:姓名-Pony Smith 年龄-43

    C#结构体和类的区别之源程序解读
    (1)本示例为了说明在传递时C#结构体和类的区别,在程序中分别定义了表示员工的类classEmployee类和表示员工的结构体structEmployee,并定义了各自的字段和构造函数。在主程序入口Main方法中,声明类的实例clsEmpA和clsEmpB,并使用构造函数创建clsEmpA类实例,然后将clsEmpA类实例传递给clsEmpB类实例,修改clsEmpB类实例的字段值,最后打印clsEmpA类实例中的字段,查看字段的值是否随clsEmpB类实例字段的修改而变化。同时,声明结构体的实例strctEmpA和strctEmpB,并使用构造函数创建strctEmpA结构体实例,然后将strctEmpA结构体实例传递给strctEmpB结构体实例,修改strctEmpB结构体实例的字段值,最后打印strctEmpA结构体实例中的字段,查看字段的值是否随strctEmpB结构体实例字段的修改而变化。程序的流程图如图8.1所示。 
    (2)C#结构体和类的区别还有一个比较明显的区别,就是类能够定义默认的、不带参数的构造函数,并能在该构造函数中初始化字段。而结构体不允许定义默认的、不带参数的构造函数。

  • 相关阅读:
    Lua弱引用table
    Javascript定义类(class)的三种方法
    双检锁技术
    【翻译】ASP.NET缓存管理
    socket python
    mvc项目
    MSBuild
    阅读glibc源码
    MVC3使用Unity实现依赖注入接口与于实现类自动注册
    C# 指针之美
  • 原文地址:https://www.cnblogs.com/wphl-27/p/5824443.html
Copyright © 2011-2022 走看看