类和结构的区别


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中compareTo和compare的区别
Apr 12 面试题
类的核心特性有哪些
Jan 01 面试题
如何提高JDBC的性能
Apr 30 面试题
c语言常见笔试题总结
Sep 05 面试题
在SQL Server中创建数据库主要有那种方式
Sep 10 面试题
.net开发工程师面试题
Feb 25 面试题
网络方面基础面试题
Nov 16 面试题
什么是属性访问器
Oct 26 面试题
Can a struct inherit from another struct? (结构体能继承结构体吗)
Sep 25 面试题
new修饰符是起什么作用
Jun 28 面试题
如何唤起类中的一个方法
Nov 29 面试题
编程用JAVA解析XML的方式
Jul 07 面试题
什么是反射
Mar 17 #面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
You might like
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
php适配器模式简单应用示例
2019/10/23 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
python得到windows自启动列表的方法
2018/10/14 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python输出决策树图形的例子
2019/08/09 Python
python中count函数简单用法
2020/01/05 Python
基于python3实现倒叙字符串
2020/02/18 Python
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
教师自我反思材料
2014/02/14 职场文书
ktv筹备计划书
2014/05/03 职场文书
实验心得体会
2014/09/05 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
先进个人推荐材料
2014/12/29 职场文书
会计专业求职信范文
2015/03/19 职场文书
详解nginx进程锁的实现
2021/06/14 Servers
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers