类和结构的区别


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

面试题 相关文章推荐
如何减少垃圾回收让内存更加有效使用
Oct 18 面试题
abstract class和interface有什么区别?
Jan 03 面试题
数据库面试要点基本概念
Oct 31 面试题
介绍一下SQL Server里面的索引视图
Jul 31 面试题
介绍一下内联、左联、右联
Dec 31 面试题
如何手工释放资源
Dec 15 面试题
某公司C#程序员面试题笔试题
May 26 面试题
sort命令的作用和用法
Nov 04 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
Apr 17 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
Feb 17 面试题
深圳茁壮笔试题
May 28 面试题
shell程序如何生命变量?shell变量是弱变量吗?
Nov 10 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
PHP中cookie知识点学习
2018/05/06 PHP
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
微信小程序开发探究
2016/12/27 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
python tkinter canvas使用实例
2019/11/04 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
python实现简单的购物程序代码实例
2020/03/03 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
Python中常用的os操作汇总
2020/11/05 Python
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
如何写出好的Java代码
2014/04/25 面试题
会计专业自我鉴定范文
2013/10/06 职场文书
新任教师自我鉴定
2014/02/24 职场文书
C++程序员求职信
2014/05/07 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python