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;
}
}
}