热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#结构的学习

结构是程序员定义的数据类型,非常的类似于类。有数据成员和函数成员。但是也有区别:1)类是引用类型,而结构是值类型;2)结构是隐式密封的

结构是程序员定义的数据类型,非常的类似于类。有数据成员和函数成员。

但是也有区别:

1)类是引用类型,而结构是值类型;

2)结构是隐式密封的,不能被派生;

语法声明与类相似:

 

  1. //结构的声明 
  2.         struct StructName 
  3.         { 
  4.             //包含的成员变量 
  5.         } 

看下边的示例代码来演示C#结构的使用方法:

 

  1. static void Main(string[] args) 
  2.         { 
  3.             Point first, second, third; 
  4.             first.x = 10; first.y = 10; 
  5.             second.x = 20; second.y = 20; 
  6.             third.x = first.x + second.x; 
  7.             third.y = first.y + second.y; 
  8.  
  9.             Console.WriteLine("first:{0},{1}",first.x,first.y); 
  10.             Console.WriteLine("second:{0},{1}",second.x,second.y); 
  11.             Console.WriteLine("third:{0},{1}",third.x,third.y); 
  12.             Console.ReadKey(); 
  13.         } 
  14.  
  15.         struct Point 
  16.         { 
  17.             public int x; 
  18.             public int y; 
  19.         } 

结构是值类型

 

1)结构类型的变量不能使null;

2)两个结构变量不能引用同一对象

 

  1. static void Main(string[] args) 
  2.         { 
  3.             CSimple cs1 = new CSimple(),cs2=null
  4.             Simple ss1 = new Simple(),ss2=new Simple(); 
  5.  
  6.             cs1.x = ss1.x = 5; 
  7.             cs1.y = ss1.y = 10; 
  8.             cs2 = cs1;   //赋值类实例 
  9.             ss2 = ss1;   //赋值结构实例 
  10.  
  11.         } 
  12.  
  13.         class CSimple 
  14.         { 
  15.             public int x; 
  16.             public int y; 
  17.         } 
  18.  
  19.         struct Simple 
  20.         { 
  21.             public int x; 
  22.             public int y; 
  23.         } 

 

先创建一个CSimple类,和一个Simple结构

 

在Main()分别对它们实例化声明两个个变量后,cs1和cs2分别指向在堆中的引用,而ss1和ss2分别在栈中分配空间并存储。
把一个结构赋值给另外一个结构,就是从一个结构中把值复值给另外一个结构。与类不同的是,复制类变量时只有引用被复制。

如上面的代码,类赋值结束后,cs2和cs1指向堆中的同一个对象。但是在结构赋值结束后,ss2成员的值和ss1成员的值相同。

 

结构中的构造函数和析构函数

语言隐式的为每个结构提供一个无参数的构造函数。这个构造函数把结构的每个成员设置为该类型的默认值,引用成员被设置成null

预定义的无参数构造函数对每个结构都存在,而且不能删除或者重新定义。但是可以创建另外的构造函数,只要他们有参数。这和类不同,对于类,编译器只在没有其它构造函数声明时提供隐式的无参数构造函数。

要调用一个构造函数,包括隐式的无参数构造函数,要使用new运算符。即使不从堆中分配内存也使用new运算符。

如下面的实例:

 

  1. static void Main(string[] args) 
  2.         { 
  3.  
  4.             Simple s1 = new Simple();  //调用隐式的构造函数 
  5.             Simple s2 = new Simple(5, 10);  //调用构造函数 
  6.             Console.WriteLine("{0},{1}",s1.x,s1.y); 
  7.             Console.WriteLine("{0},{1}", s2.x, s2.y); 
  8.              
  9.             Console.ReadKey(); 
  10.         } 
  11.  
  12.         struct Simple 
  13.         { 
  14.             public int x; 
  15.             public int y; 
  16.  
  17.             public Simple(int a, int b) 
  18.             { 
  19.                 x = a; 
  20.                 y = b; 
  21.             } 
  22.         } 

 

也可以不适用new运算符创建结构的实例。但是,有一些限制:

 

1)不能使用数据成员的值,直到显示的设置它

2)不能调用任何函数成员,直到所有数据成员已经被赋值

 

  1. static void Main(string[] args) 
  2.         { 
  3.  
  4.             Simple s1, s2; 
  5.             Console.WriteLine("{0},{1}", s1.x, s1.y);//编译错误,s1.x, s1.y还没有被赋值 
  6.  
  7.             s2.x = 50; 
  8.             s2.y = 10; 
  9.             Console.WriteLine("{0},{1}", s2.x, s2.y); 
  10.  
  11.        
  12.             Console.ReadKey(); 
  13.         } 
  14.  
  15.         struct Simple 
  16.         { 
  17.             public int x; 
  18.             public int y; 
  19.         } 

 

 

 


原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

C#结构的学习
 

 


推荐阅读
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文提供了多种方法来计算给定年份和月份的起始日和结束日,并进一步探讨了如何根据年、月、周获取特定周的起始日和结束日。 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • Java 中重写与重载的区别
    本文详细解析了 Java 编程语言中重写(Override)和重载(Overload)的概念及其主要区别,帮助开发者更好地理解和应用这两种多态性机制。 ... [详细]
  • 本文详细解析了Java中throw和throws的关键区别,同时涵盖了JDK的定义、Java虚拟机的关键约定、Java的跨平台性、自动垃圾回收机制、源文件结构、包的概念及作用等多个核心知识点,旨在帮助学生更好地准备Java期末考试。 ... [详细]
  • 本文详细介绍了装饰者(Decorator)模式,这是一种动态地为对象添加职责的方法。与传统的继承方式不同,装饰者模式通过组合而非继承来实现功能扩展,从而提供更大的灵活性和可维护性。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
author-avatar
亚璨的秘密
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有