类和结构的区别


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

面试题 相关文章推荐
怎么可以提高数据库查询数据的速度
Jun 28 面试题
南京软件公司的.net程序员笔试题
Aug 31 面试题
什么是Assembly(程序集)
Sep 14 面试题
Internal修饰符有什么含义
Jul 10 面试题
星空联盟C# .net笔试题
Dec 05 面试题
Windows和Linux动态库应用异同
Jul 28 面试题
How to spawning asynchronous work in J2EE
Aug 29 面试题
介绍一下EJB的分类及其各自的功能及应用
Aug 23 面试题
AJAX都有哪些有点和缺点
Nov 03 面试题
Python中pass语句的作用是什么
Jun 01 面试题
介绍下java.util.Arrays类
Oct 16 面试题
什么是封装
Mar 26 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
基于php 随机数的深入理解
2013/06/05 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
three.js中文文档学习之创建场景
2017/11/20 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python函数参数*args**kwargs用法实例
2013/12/04 Python
Python httplib模块使用实例
2015/04/11 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
父亲的菜园教学反思
2014/02/13 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
2015年党员自评材料
2014/12/17 职场文书
2019暑假学生安全口号
2019/06/27 职场文书