类和结构的区别


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

面试题 相关文章推荐
一个C/C++编程面试题
Nov 10 面试题
如何提高SQL Server的安全性
Jul 25 面试题
什么是数据抽象
Nov 26 面试题
CLR与IL分别是什么含义
Aug 23 面试题
西安当代医院管理研究院笔试题
Dec 11 面试题
别名指示符是什么
Oct 08 面试题
Linux如何修改文件和文件夹的权限
Jun 27 面试题
系统管理员的职责包括那些?管理的对象是什么?
Jan 18 面试题
GWebs公司笔试题
May 04 面试题
GWT (Google Web Toolkit)有哪些主要的原件组成?
Jun 08 面试题
十一个高级MySql面试题
Oct 06 面试题
Java程序员综合测试题
Apr 25 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
详解numpy的argmax的具体使用
2019/05/27 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
Internet体系结构
2014/12/21 面试题
社团2014年植树节活动总结
2014/03/11 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
春晚观后感
2015/06/11 职场文书
python 逐步回归算法
2021/04/06 Python
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫