类和结构的区别


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和Javasciprt的区别
Sep 02 面试题
const char*, char const*, char*const的区别是什么
Jul 09 面试题
汇智创新科技发展有限公司
Dec 06 面试题
SQL里面如何插入自动增长序列号字段
Mar 29 面试题
.NET面试10题
Feb 24 面试题
介绍一下.NET构架下remoting和webservice
May 08 面试题
sealed修饰符是干什么的
Oct 23 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
Jul 14 面试题
什么是lambda函数
Sep 17 面试题
JDBC操作数据库的基本流程是什么
Oct 28 面试题
遇到的Mysql的面试题
Jun 29 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
May 01 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
php程序效率优化的一些策略小结
2010/07/17 PHP
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
实例讲解PHP表单处理
2019/02/15 PHP
基于jquery库的tab新形式使用
2012/11/16 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
js分页代码分享
2014/04/28 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
python2与python3的print及字符串格式化小结
2018/11/30 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
简单了解Django ContentType内置组件
2019/07/23 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
药学专业毕业生求职信
2013/10/20 职场文书
金融专业应届生求职信
2013/11/02 职场文书
水污染治理专业毕业生推荐信
2013/11/14 职场文书
自我查摆剖析材料
2014/10/11 职场文书
公司授权委托书
2014/10/17 职场文书
上课说话检讨书500字
2014/11/01 职场文书
党员带头倡议书
2015/04/29 职场文书
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers