类和结构的区别


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...

面试题 相关文章推荐
康拓普公司Java笔面试
Sep 23 面试题
JRE、JDK、JVM之间的关系怎样
May 16 面试题
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
Apr 28 面试题
华美博弈C/VC工程师笔试试题
Jul 16 面试题
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
Nov 09 面试题
利用异或运算实现两个无符号数的加法运算
Dec 20 面试题
remote接口和home接口主要作用
May 15 面试题
为什么要用EJB
Apr 17 面试题
Java中的类包括什么内容?设计时要注意哪些方面
May 23 面试题
Unix里面如何在后台运行程序
Oct 14 面试题
J2EE中的容器都包括哪些
Aug 21 面试题
介绍一下你对SOA的认识
Apr 24 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
php 全文搜索和替换的实现代码
2008/07/29 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
js实现拖拽功能
2017/03/01 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
python命令行工具Click快速掌握
2019/07/04 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
英国假发网站:Hothair
2018/02/23 全球购物
介绍一下#error预处理
2015/09/25 面试题
电气专业应届生求职信
2013/11/01 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
股东协议书
2014/04/14 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
新教师教学工作总结
2015/08/14 职场文书
2016银行求职自荐信
2016/01/28 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL