类和结构的区别


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

面试题 相关文章推荐
weblogic面试题
Mar 07 面试题
输入N,打印N*N矩阵
Feb 20 面试题
写出一个方法实现冒泡排序
Jul 08 面试题
经典c++面试题六
Jan 18 面试题
存储过程的优点有哪些
Sep 27 面试题
北京一家公司的.net开发工程师笔试题
Apr 17 面试题
NET程序员上机面试题
May 23 面试题
网络方面基础面试题
Nov 16 面试题
Linux文件操作命令都有哪些
Jul 23 面试题
如何用Python输出一个Fibonacci数列
Aug 28 面试题
方正Java笔试题
Jul 03 面试题
关键字throw与throws的用法差异
Nov 22 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
javascript call方法使用说明
2010/01/11 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
Python多进程编程常用方法解析
2020/03/26 Python
python绘制汉诺塔
2021/03/01 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
大学校园毕业自我鉴定
2014/01/15 职场文书
消防安全检查制度
2014/02/04 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
个人担保书格式范文
2014/05/12 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
清洁员岗位职责
2015/02/15 职场文书
感恩节寄语2015
2015/03/24 职场文书
运动会通讯稿50字
2015/07/20 职场文书
《社戏》教学反思
2016/02/22 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python
Elasticsearch 批量操作
2022/04/19 Python