转载 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", ); classEmployee clsEmpB = clsEmpA; //修改引用数据
clsEmpB.Age = ; //使用带参数的构造函数创建员工结构体的实例
structEmployee strctEmpA =
new structEmployee("Pony", "Smith", ); structEmployee strctEmpB = strctEmpA; //修改
strctEmpB.Age = ; 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 = ;
}
//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#结构体和类的区别还有一个比较明显的区别,就是类能够定义默认的、不带参数的构造函数,并能在该构造函数中初始化字段。而结构体不允许定义默认的、不带参数的构造函数。
转载 C#结构体(struct)和类(class)的区别的更多相关文章
- c#中结构体(struct)和类(class)的区别
一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...
- Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别
Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...
- sql自动生成golang结构体struct实体类
废话不多说直接上地址 使用地址 http://www.linkinstars.com:8090/auto-code 项目github https://github.com/LinkinStars/Au ...
- C++/C#:类Class与结构体Struct的区别
C++中: 默认的访问控制.继承访问权限不同:struct时public的,class时 private的: 其它基本一样. C#中: struct是值类型,class是引用类型的: struct S ...
- 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...
- OC基础--结构体 枚举做类成员属性
结构体 枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期 毕业日期 -- 结构体 代码示例: 声明文件 Student.h: #import <Foundation ...
- 结构体struct 与 联合union
1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{ //struct为关键字,“结构体名”为用户定义的类型标识. ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
随机推荐
- 注意:C++中double的表示是有误差的
注意:C++中double的表示是有误差的,直接通过下面的例子看一下 #include<iostream> using namespace std; int main() { double ...
- Codeforces Round #239 (Div. 2)
做了三个题,先贴一下代码...终于涨分了 A. Line to Cashier 水题 #include <iostream> #include <cstdio> #includ ...
- POJ 1113 凸包模板题
上模板. #include <cstdio> #include <cstring> #include <iostream> #include <algorit ...
- Qt之进程间通信(QProcess)
简述 QProcess可以在应用程序内部与其它进程通信,或启动其它应用程序.与在终端机之类的命令输入窗口上使用名称和参数是一样的,可以使用QProcess提供的函数start()启动进程.可以注册QS ...
- codevs 1218 疫情控制
啊好烦这道题.... 基本思路网上都有. 注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源.(因为不花钱). 不过数据好水.... #include<iostream ...
- UVA 820 Internet Bandwidth 因特网宽带(无向图,最大流,常规)
题意:给一个无向图,每条边上都有容量的限制,要求求出给定起点和终点的最大流. 思路:每条无向边就得拆成2条,每条还得有反向边,所以共4条.源点汇点已经给出,所以不用建了.直接在图上跑最大流就可以了. ...
- wave文件(*.wav)格式、PCM数据格式
1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采 ...
- 【转】linux : waitpid函数
原文网址:http://blog.csdn.net/jifengszf/article/details/3067841 [waitpid系统调用] 功能描述: 等待进程改变其状态.所有下面 ...
- 【转】TLB(Translation Lookaside Buffers,TLB)的作用
原文网址:http://sdnydubing.blog.163.com/blog/static/137470570201122810503396/ 从虚拟地址到物理地址的转换过程可知:使用一级页表进行 ...
- 提高Web页面性能的技巧
现在动辄几兆大小的页面加载量,让性能优化成了不可避免的热门话题.WEB 应用越流畅,用户体验就会越好,继而带来更多的访问量.这也就是说,我们应该反省一下那些过度美化的 CSS3 动画和多重操作的 DO ...