类和结构的区别


Posted in 面试题 onAugust 15, 2012
类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口
示例:
根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。
如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) 最好使用类,而 Geometry 中点的成员最好使用结构
using System;
using System.Collections.Generic;
using System.Text;
namespace Example16
{
interface IPoint
{
double X
{
get;
set;
}
double Y
{
get;
set;
}
double Z
{
get;
set;
}
}
//结构也可以从接口继承
struct Point: IPoint
{
private double x, y, z;
//结构也可以增加构造函数
public Point(double X, double Y, double Z)
{
this.x = X;
this.y = Y;
this.z = Z;
}
public double X
{
get { return x; }
set { x = value; }
}
public double Y
{
get { return x; }
set { x = value; }
}
public double Z
{
get { return x; }
set { x = value; }
}
}
//在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)等复杂操作
class PointGeometry
{
private Point value;
public PointGeometry(double X, double Y, double Z)
{
value = new Point(X, Y, Z);
}
public PointGeometry(Point value)
{
//结构的赋值将分配新的内存
this.value = value;
}
public double X
{
get { return value.X; }
set { this.value.X = value; }
}
public double Y
{
get { return value.Y; }
set { this.value.Y = value; }
}
public double Z
{
get { return value.Z; }
set { this.value.Z = value; }
}
public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth)
{
return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
}
public override string ToString()
{
return string.Format(“X: {0}, Y: {1}, Z: {2}”, value.X, value.Y, value.Z);
}
}
class Program
{
static void Main(string[] args)
{
Point tmpPoint = new Point(1, 2, 3);
PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
tmpPG2.X = 4;
tmpPG2.Y = 5;
tmpPG2.Z = 6;
//由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样
Console.WriteLine(tmpPG1);
Console.WriteLine(tmpPG2);
//由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3
PointGeometry tmpPG3 = tmpPG1;
tmpPG1.X = 7;
tmpPG1.Y = 8;
tmpPG1.Z = 9;
Console.WriteLine(tmpPG1);
Console.WriteLine(tmpPG3);
Console.ReadLine();
}
}
}
结果:
X: 1, Y: 2, Z: 3
X: 4, Y: 5, Z: 6
X: 7, Y: 8, Z: 9
X: 7, Y: 8, Z: 9

Tags in this post...

面试题 相关文章推荐
如何使用PHP session
Apr 21 面试题
介绍java中初始化块的使用
Sep 11 面试题
东方通信股份有限公司VC面试题
Aug 27 面试题
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
Apr 15 面试题
将n个数按输入顺序的逆序排列,用函数实现
Nov 14 面试题
写一个用矩形法求定积分的通用函数
Nov 08 面试题
局域网定义和特性
Jan 23 面试题
如何利用cmp命令比较文件
Sep 23 面试题
易程科技软件测试笔试
Mar 24 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Jul 27 面试题
final, finally, finalize的区别
Mar 01 面试题
一套Delphi的笔试题一
Feb 14 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
php正则
2006/07/07 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
js验证密码强度解析
2020/03/18 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Python中Random和Math模块学习笔记
2015/05/18 Python
简单学习Python time模块
2016/04/29 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
python 中random模块的常用方法总结
2017/07/08 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Java文件和目录(IO)操作
2014/08/26 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
考试作弊检讨
2015/01/27 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书