C#结构的学习

简介:

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

但是也有区别:

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

 





     本文转自yisuowushinian 51CTO博客,原文链接:http://blog.51cto.com/yisuowushinian/1114359,如需转载请自行联系原作者


相关文章
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
556 0
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量(如`int x = 10`)、常量(`const int MAX_VALUE = 100`)、运算符(如算术和比较运算符)、控制语句(if、for、while等)和函数声明(`int Add(int x, int y) { return x + y; }`)。这些构成C#程序的基本元素。
194 0
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
534 2
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
839 0
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
199 3
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
455 0
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
185 1
|
Dart 算法 JavaScript
C#数据结构与算法入门教程,值得收藏学习!
C#数据结构与算法入门教程,值得收藏学习!
297 0
|
数据采集 数据可视化 搜索推荐
提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票
使用C#和Fizzler库,开发一个多线程爬虫,高效抓取五一假期特价机票信息。通过代理IP规避反爬策略,实现实时数据更新、个性化推送及数据可视化分析。示例代码展示如何配置代理、发送HTTP请求、解析HTML并提取机票详情。注意适应实际环境调整参数。祝编码愉快!
266 0
提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
215 0