类与结构

目录

  • 类与结构的实例比较
  • 类与结构的差别
  • 如何选择结构还是类

类与结构的示例比较

结构示例

public struct Person
{
    string Name;
    int  height;
    int  weight
   
    public bool overWeight()
    {
        //implement something
}
}

类示例

public class TestTime
{
    int hours;
    int minutes;
    int seconds;
   
    public void passtime()
    {
        //implementation of behavior
    }
}

调用过程

public class Test
{
    public static ovid Main
    {
        Person Myperson=new Person      //声明结构
        TestTime Mytime=New TestTime    //声明类
    }
}

从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?

类与结构的差别

值类型与引用类型

结构

结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型。

类是引用类型,引用类型在堆上分配地址。

堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑。

因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用。

说明:

  • 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),C# 中所有类型的基类型都是 Object。
  • 虽然结构的初始化也使用了 new 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用。

继承性

结构

不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用 sealed 声明,可是结构是隐式的 sealed。

完全可扩展的,除非显示的声明 sealed,否则类可以继承其他类和接口,自身也能被继承。

说明:

  • 虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样。

    例如:结构实现接口

    interface IImage
    {
        void Paint();
    }
     
    struct Picture : IImage
    {
        public void Paint()
        {
             // painting code goes here
        }
       
        private int x, y, z;
       // other struct members
    }

内部结构

结构

  • 没有默认的构造函数,但是可以添加构造函数
  • 没有析构函数
  • 没有 abstract 和 sealed(因为不能继承)
  • 不能有 protected 修饰符
  • 可以不使用 new 初始化
  • 在结构中初始化实例字段是错误的

  • 有默认的构造函数
  • 有析构函数
  • 可以使用 abstract 和 sealed
  • 有 protected 修饰符
  • 必须使用 new 初始化

如何选择结构还是类

讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

  • 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。
  • 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
  • 在表现抽象和多级别的对象层次时,类是最好的选择。
  • 大多数情况下该类型只是一些数据时,结构时最佳的选择。

----

网友在 CSDN 上的回答:

结构可以看作是轻量级的类,在性能上要好一点。

相同之处:

  • 结构和类对于程序来讲都通过指针操作,同样是面向对象的形式。

不同之处:

  • 结构体对象总是在线程堆栈上操作,而不是托管堆上。
  • 不能继承一个结构体(所以在调用结构体的方法时不需要查找 vtable: 虚函数继承表)
  • 我们不能声明构造函数为空的结构体(不晓得为啥非得要这么设计)
  • 结构体的构造函数内必须初始化所有变量(不晓得为啥非得要这么设计)
  • 结构体的字段不能有默认值(默认都是二进制意义上的零值),但是可以在构造函数内改变“默认值”

.....

按照MSDN上的意思,实际上适合用 struct 的场合很小,结构使用指南:

  • 行为与基元类型一样。
  • 具有 16 字节以下的实例大小。
  • 是不可改变的。
  • 值语义是合意的。

转载于:https://www.cnblogs.com/rudy/archive/2009/05/26/1490453.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习 jQuery 源码整体架构,打造属于自己的 js 类库

虽然现在基本不怎么使用 jQuery了,但 jQuery流行 10多年的 JS库,还是有必要学习它的源码的。也可以学着打造属于自己的 js类库,求职面试时可以增色不少。本文章学习的是 v3.4.1版本。unpkg.com源码地址:https://unpkg.com/jquery3…

5分钟轻松教您如果组建100-500路大型拼接监控系统!

冰山融汇百家号17-07-2700:41大型监控系统如何组网,分布式还是集中式?可靠性与性价比又如何取舍?什么才是最合适的视频监控存储产品?在不同地区、行业的项目中,这些疑问均成为业主、专家、系统集成商等各方面共同关注的…

python中beautifulsoup_面向新手解析python Beautiful Soup基本用法

Beautiful Soup就是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据。它有如下三个特点:Beautiful Soup提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取…

(转)mssql2005生成表字典

出处不详 CodeSELECT TOP 100 PERCENT --a.id, CASE WHEN a.colorder 1 THEN d.name ELSE END AS 表名, CASE WHEN a.colorder 1 THEN isnull(f.value, ) ELSE END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名, CASE WHEN COLUMNPROPERTY(a.id, a.name, IsIdenti…

表操作

2019独角兽企业重金招聘Python工程师标准>>> 字段修改 alter table TA drop partition (day<2018-12-10); ALTER TABLE TB ADD COLUMNS (userStatus String) CASCADE; ALTER TABLE TC change appversion appCommonVersion String CASCADE; ALTER TABLE TD DROP C…

KindEditor js 路径修改及表单提交注意事项

参考资料&#xff1a;http://www.kindsoft.net/docs/usage.html 在具体项目中&#xff0c;往往需要将js统一管理&#xff0c;如放置同一目录js中&#xff0c;那么对应的kindeditor的调用脚本也要跟着变&#xff1a; 目录结构&#xff1a; |--program |--|--html |--|--|--i…

学习underscore源码整体架构,打造属于自己的函数式编程类库

前言上一篇文章写了 jQuery整体架构&#xff0c;学习 jQuery 源码整体架构&#xff0c;打造属于自己的 js 类库虽然看过挺多 underscore.js分析类的文章&#xff0c;但总感觉少点什么。这也许就是纸上得来终觉浅&#xff0c;绝知此事要躬行吧。于是决定自己写一篇学习 undersco…

python xlsx 大文件_Python这样操作能存储100多万行的xlsx文件!Python让你事半功倍!

(1) 如果excel文件是xls&#xff0c;2003版的&#xff0c;使用xlrd和xlwt库来对xls文件进行操作(2) 如果excel文件是xlsx&#xff0c;2007以上版的&#xff0c;使用openpyxl库来对xlsx文件进行操作Tips:xlrd、xlwt和openpyxl非python自带库&#xff0c;需要进行安装&#xff0c…

linux 如何在命令行下改系统时间

我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2009年6月1日的命令如下。   #date -s 06/01/2009 或#date -s 20090601 将系统时间设定成下午15点43分0秒的命令如下。   #date -s 15:43:00   注意&#xff0c;这里说的是系统…

拓扑目的 1.Pc9通过van3访问pc10 2.Pc9通过Vlan1\Vlan2访问pc11

1拓扑图2设置路由器R12的接口的IPint g0/0/0ip address 192.168.20.254 24undo shutdown int g0/0/01ip address 192.168.1.1 24undo shutdownint g2/0/00ip address 192.168.3.1 24undo shutdown 3设置路由器R10的接口的IPint g0/0/0ip address 192.168.2.1 24undo shutdownin…

PHP 发送Email的几种方法

转载链接&#xff1a;http://blog.009it.com/php/75.html 在php中发送Email可以直接调用系统的mail()函数来完成&#xff0c;但是前提是你在php.ini文件中对mail都已经配置好了&#xff0c;以下为相关的配置信息&#xff1a; [mail function] ; For Win32 only. SMTP localho…

学习 lodash 源码整体架构,打造属于自己的函数式编程类库

前言这是 学习源码整体架构系列第三篇。整体架构这词语好像有点大&#xff0c;姑且就算是源码整体结构吧&#xff0c;主要就是学习是代码整体结构&#xff0c;不深究其他不是主线的具体函数的实现。文章学习的是打包整合后的代码&#xff0c;不是实际仓库中的拆分的代码。上上篇…

python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例

本文实例讲述了Python操作mongodb数据库进行模糊查询操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;# -*- coding: utf-8 -*-import pymongoimport refrom pymongo import MongoClient#创建连接#10.20.66.106client MongoClient(10.20.4.79,27017)#client Mong…

推荐一个快速反射调用的类

使用传统的.net反射机制&#xff0c;调用类的方法时&#xff0c;在调用频率大的情况下&#xff0c;会感觉速度很慢。最近浏览卢彦的博客时&#xff0c;找到一个他改进后的反射调用类。试用以后感觉效率明显提高&#xff0c;特推荐给大家。作者重新实现了&#xff0c;反射调用方…

CMake 构建项目Android NDK项目基础知识

本篇文章将介绍如何使用 CMake 构建实现你的第一个 NDK 项目。 ##前言 你好&#xff01;欢迎来到我的的学习笔记分享系列&#xff0c;第一次给大家分享的是 Android NDK 开发的学习笔记&#xff0c;让我们先开始了解 NDK 的构建方式吧&#xff01; NDK 构建方式有两种&#xff…

linux installaccess Nessus-5.2.4

1、Download: http://www.tenable.com/products/nessus/select-your-operating-system 2、Current version&#xff1a;Nessus-5.2.4-debian6_i386.deb 3、Install&#xff1a;dpkg -i Nessus-5.2.4-debian6_i386.deb # dpkg -i Nessus-5.2.4-debian6_i386.deb Selecting p…

面试官问:JS的继承

原文作者若川&#xff0c;掘金链接&#xff1a;https://juejin.im/post/5c433e216fb9a049c15f841b写于2019年2月20日&#xff0c;现在发到公众号声明原创&#xff0c;之前被《前端大全》公众号等转载阅读量超1w&#xff0c;知乎掘金等累计阅读量超过1w。导读&#xff1a;文章主…

qt 快速按行读取文件_这是知识点之Linux下分割文件并保留文件头

点击上方"开发者的花花世界"&#xff0c;选择"设为星标"技术干货不定时送达&#xff01;这是一个知识点方便快捷的给结构化数据文件分割大小并保留文件的表头&#xff0c;几十个G的结构化文件不仅阅读编辑麻烦&#xff0c;而且使用受限&#xff0c;因此高效…

mono 调用windows webService

1. 实现linux mono Develop中调用windows 中的webService l linux 与 windows 在一个局域网的网段中 l windows 的IIs中发布webService 2. windows 中的设置 l webService 的代码 using System; using System.Collections.Generic; using System.Linq; using S…

Linux 内存机制

转载链接&#xff1a;http://blog.csdn.net/tianlesoftware/article/details/5463790 一. 内存使用说明 Free 命令相对于top 提供了更简洁的查看系统内存使用情况&#xff1a; [rootrac1 ~]# free total used free shared buffers cached Mem: …