类和结构的区别


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面试题及答案-编程题
Oct 14 面试题
Linux中如何设置Java环境变量(Ubuntu)
Jul 24 面试题
是否有自动比较结构的方法
Jun 03 面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
Nov 18 面试题
天游软件面试
Nov 23 面试题
在SQL Server中创建数据库主要有那种方式
Sep 10 面试题
北京某公司的.net笔试题
Mar 20 面试题
Ado与Ado.net的相同与不同
Dec 08 面试题
WINDOWS域的具体实现方式是什么
Feb 20 面试题
远东集团网络工程师面试题
Oct 20 面试题
linux面试题参考答案(6)
Jun 23 面试题
GWT都有什么特性
Dec 02 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
destoon常用的安全设置概述
2014/06/21 PHP
PHP代码优化技巧小结
2015/09/29 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
Python装饰器使用示例及实际应用例子
2015/03/06 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
Python 读取位于包中的数据文件
2020/08/07 Python
Notino法国:购买香水和化妆品
2019/04/15 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
JAVA招聘远程笔试题
2015/07/23 面试题
村委会贫困证明
2014/01/14 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
Python关于OS文件目录处理的实例分享
2021/05/23 Python