类和结构的区别


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

面试题 相关文章推荐
Yahoo的PHP面试题
May 26 面试题
什么是serialVersionUID
Mar 04 面试题
精伦电子Java笔试题
Jan 16 面试题
神路信息Java面试题目
Mar 31 面试题
一份Java笔试题
Feb 21 面试题
JAVA代码查错题
Oct 10 面试题
为什么会有内存对齐
Oct 10 面试题
广州迈达威.net面试题目
Mar 10 面试题
.NET面试问题集
Dec 08 面试题
this关键字的含义
Apr 08 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
Jul 11 面试题
如何用Java判断一个文件或目录是否存在
Nov 19 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
调试PHP程序的多种方法介绍
2014/11/06 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
Python中的字典遍历备忘
2015/01/17 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python 两个数据库postgresql对比
2019/10/21 Python
django使用xadmin的全局配置详解
2019/11/15 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
护理学毕业生自荐信
2013/10/02 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
多人股份制合作协议书
2016/03/19 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis