C# 结构体与类的区别


C#结构体和类的区别是什么呢?C#结构体和类的区别是如何表现的呢?本文就向你讲述这方面的内容。

 


C#结构体和类的区别技术要点:

◆类在传递的时候,传递的内容是位于托管内存中的位置,结构体在传递的时候,传递的内容是位于程序堆栈区的内容。当类的传递对象修改时,将同时修改源对象,而结构体的传递对象修改时,不会对源对象产生影响。

◆在一个类中,可以定义默认的、不带参数的构造函数,而在结构体中不能定义默认的、不带参数的构造函数。两者都可以定义带有参数的构造函数,通过这些参数给各自的字段赋值或初始化。

 

类是引用类型,继承System.Object,数据存储在堆上,结构体值类型,继承System.ValueType,数据存储在堆栈上;堆栈上的对象有编译器自动创建和销毁,所以堆栈的执行效率要高些,但是堆栈资源有限,不适合出力复杂的大的逻辑,所以结构体出力小对象。

struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。下面的示例显示了一个简单的结构声明。

尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。

结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。

结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

向方法传递结构时.结构是通过传值方式传递的,不是作为引用方式传递.

与类不同,结构的实例化可以不使用new运算符.

一个结构不能从另一个结构或类继承,而且不能作为一个类的基。

结构可以实现接口。

在结构中初始化实例字段是错误的,将导致编译错误,因为结构体现在属于一个数据类型,它不占用存储空间,只有在定义变量的时候才能初始化使用


 


 

应用实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//C#结构体和类的区别
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)   
        {   
            //使用带参数的构造函数创建员工类的实例   
            classEmployee clsEmpA = new classEmployee("Pony", "Smith", 43);//带参数构造
            //classEmployee clsEmpA = new classEmployee();  //不带参数构造  
            classEmployee clsEmpB = clsEmpA;    //修改引用数据   
            clsEmpB.Age = 33;    //使用带参数的构造函数创建员工结构体的实例 
 
            //structEmployee strctEmpA = new structEmployee("Pony", "Smith", 43);//带参数构造
            //structEmployee strctEmpA = new structEmployee();  //不带参数构造  
            structEmployee strctEmpA =new structEmployee(){FirstName="Pony",LastName="Smith",Age=43}; //这种方法初始化正确
            //structEmployee strctEmpA = { "Pony", "Smith", 43 };  //这种赋值方法是错误的。

            //结构的实例化可以不使用new运算符
            //下面代码是错误的,结构体中不使用属性构造器就没有问题。
            //structEmployee strctEmpA;
            //strctEmpA.FirstName = "";
            //strctEmpA.LastName = "";
            //strctEmpA.Age = 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;  
        private string lastname;  
        private int age; 
        public string FirstName   
        {   
            get { return firstname; }   
            set { firstname = value; }   
        }     
        public string LastName   
        {   
            get { return lastname; }   
            set { lastname = value; }   
        }   
        public int Age   
        {   
            get { return age; }   
            set { age = value; }   
        }   
        //C#结构体和类的区别 
        //在结构体中不能定义默认的不带参数的构造函数,只能定义结构体的带参数的构造函数   
        public structEmployee(string strFirstNamem, string strLastName, int iAge)
        {
            firstname = strFirstNamem;
            lastname = strLastName;
            age = iAge;
        }   
    }   
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值