学习c#的第十一天

目录

C# 结构体(Struct)

定义结构体

C# 结构的特点

类 vs 结构

C# 枚举(Enum)

声明 enum 变量

实例


C# 结构体(Struct)

定义结构体

在 C# 中,定义结构体使用关键字 struct。下面是一个简单的例子:

public struct Point
{public int X;public int Y;public Point(int x, int y){X = x;Y = y;}
}

在这个例子中,我们定义了一个名为 Point 的结构体,它有两个公共的整型成员变量 X 和 Y。此外,我们还定义了一个带有两个参数的构造函数来初始化 X 和 Y 的值。

在 C# 中,结构体是一种值类型,与类不同,它们是按值进行分配和传递的,而不是按引用。结构体通常用于表示轻量级的数据结构,比如坐标、颜色、矩形等简单的数据类型。

使用结构体可以避免创建对象实例时引发的开销,并且在某些情况下有助于提高性能。在 C# 中,结构体经常用于创建小型不可变的数据结构,以及在需要高性能的场景中使用。

C# 结构的特点

C# 中的结构(Struct)与传统的 C 或 C++ 中的结构有一些显著的不同,下面是结构在 C# 中的特点:

  1. 包含方法、字段等成员: 结构体可以包含方法、字段、索引器、属性、运算符方法和事件等成员,使得结构体可以拥有丰富的功能和行为。
  2. 可定义构造函数: 结构体可以定义构造函数来初始化实例,但不能定义析构函数。此外,不能为结构体定义无参构造函数,因为默认的无参构造函数是自动定义的且不可改变的。
  3. 不支持继承: 与类不同,结构体不能继承其他结构或类,也不能作为其他结构或类的基础结构。
  4. 可实现接口: 结构体可以实现一个或多个接口,从而获得接口的所有特性和行为。
  5. 成员限制: 结构体的成员不能指定为 abstract、virtual 或 protected。
  6. 实例化: 当使用 new 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 new 操作符即可被实例化。如果不使用 new 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才能被使用。

总的来说,C# 中的结构体具有更丰富的功能和行为,允许包含方法、实现接口等特性,同时也有一些与类不同的限制和特点。

类 vs 结构

类和结构的主要区别包括:

  1. 类是引用类型,而结构是值类型。这意味着当你操作类对象时,你实际上操作的是引用,而当你操作结构对象时,你操作的是对象的实际值。

  2. 类支持继承和多态,而结构不支持继承。

  3. 结构不能声明默认的无参构造函数。这意味着如果你想在创建结构实例时使用无参构造函数,你必须显式地定义一个。

这些区别决定了在不同的情况下应该选择类还是结构。

在选择类(class)和结构(struct)时,需要根据具体的需求来进行权衡。

  • 当需要表示一个轻量级的数据结构时,结构是一个不错的选择,因为它们可以在栈上分配内存,访问速度较快,而且相对较小的结构也更容易复制。通常情况下,结构适合用于描述简单的数据类型,比如坐标、颜色等。
  • 另一方面,类通常用于表示更复杂的对象,这些对象可能有更多的行为和状态,而且通常会被分配到堆上。使用类可以方便地进行引用传递,这意味着对象的引用地址可以被传递,而不是对象的拷贝。这对于需要共享数据或者需要对同一份数据进行修改的情况非常有用。

因此,在选择类还是结构时,需要考虑到数据的复杂性、大小、生命周期以及是否需要进行引用传递等因素。

代码示例

using System;public class Person
{public string Name { get; set; } // 姓名属性public int Age { get; set; } // 年龄属性public void SayHello(){Console.WriteLine("你好,我的名字是 " + Name + ",而我今年 " + Age + " 岁了。"); // 打印问候语}
}public struct Point
{public int X { get; set; } // X 坐标属性public int Y { get; set; } // Y 坐标属性public Point(int x, int y){X = x;Y = y;}
}class Program
{static void Main(){// 使用类的实例Person person = new Person();person.Name = "John"; // 设置姓名person.Age = 25; // 设置年龄person.SayHello(); // 调用方法进行打招呼// 使用结构的实例Point point = new Point(10, 20); // 创建点对象,传入坐标值Console.WriteLine("X 坐标: " + point.X); // 打印X坐标值Console.WriteLine("Y 坐标: " + point.Y); // 打印Y坐标值}
}

C# 枚举(Enum)

枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。

声明 enum 变量

声明枚举的一般语法:

enum <enum_name>
{ enumeration list 
};

其中,

  • enum_name 指定枚举的类型名称。
  • enumeration list 是一个用逗号分隔的标识符列表。

枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如:

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

注意:

枚举类型是一种用于定义常量集合的数据类型,适用于那些取值范围有限的数据。枚举类型能够帮助我们固定取值范围,并且易于阅读和使用。

在 C# 中,枚举的默认访问权限修饰符是 internal,枚举名遵循大驼峰命名法,而且枚举的每个值都是整型,默认从 0 开始。此外,枚举中元素的值可以设置为相同,但并不推荐这样做,因为这可能会导致代码可读性下降,增加混淆。

默认情况下,C#中的枚举元素的基础类型是int型。但可以通过指定其他整型类型来修改枚举的基础类型。合法的整型基础类型包括 byte、sbyte、short、ushort、int、uint、long 和 ulong。例如,可以使用以下语法将枚举的基础类型设置为byte:

enum MyEnum : byte
{Value1,Value2,Value3
}

在此示例中,MyEnum 枚举的基础类型被显式设置为 byte。

实例

using System;
using System.ComponentModel;public enum Season
{[Description("春天")]Spring,[Description("夏天")]Summer,[Description("秋天")]Autumn,[Description("冬天")]Winter
}class Program
{static void Main(){Season currentSeason = Season.Winter;string seasonName = GetEnumDescription(currentSeason);Console.WriteLine("当前季节是:" + seasonName);}// 获取枚举成员的描述值static string GetEnumDescription(Enum value){var fieldInfo = value.GetType().GetField(value.ToString());var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);return attributes.Length > 0 ? attributes[0].Description : value.ToString();}
}

在这个示例中,我们使用 Description 特性为枚举成员定义了中文名称,并编写了一个辅助方法 GetEnumDescription 来获取枚举成员的描述值。当我们需要显示枚举成员对应的中文季节名称时,我们可以通过该方法来实现。

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

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

相关文章

【JMeter】组件之 Listener监听器选择

JMeter中监听器的作用就是收集、显示JMeter取样器的结果&#xff0c;并以树形、图表、表格的形式显示出来。还可以将监听结果保存成文件。 View Results Tree-->察看结果树 Summary Report-->汇总报告 为测试中的每个不同命名的请求创建一行。这与聚合报告类似&#xff…

C与汇编深入分析

汇编怎么调用C函数 直接调用 BL main传参数 在arm中有个ATPCS规则&#xff08;ARM-THUMB procedure call standard&#xff09;&#xff08;ARM-Thumb过程调用标准&#xff09;。 约定r0-r15寄存器的用途&#xff1a; r0-r3&#xff1a;调用者和被调用者之间传递参数r4-r11…

Java --- JVM之垃圾回收概述

目录 一、什么是垃圾 二、为什么需要GC 三、早期垃圾回收行为 四、Java垃圾回收机制 一、什么是垃圾 1、垃圾收集&#xff0c;不是Java语言的伴生产物。早在1960年&#xff0c;第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 2、垃圾收集机制是Java语言的招牌…

用Go实现yaml文件节点动态解析

1.摘要 在大多数Go语言项目中, 配置文件通常为yaml文件格式, 在文件中可以设置项目中可灵活配置的各类参数, 通常这类参数都是比较固定的, 可以将其映射为对应的结构体在项目中进行使用, 如果需要调整参数时, 只需要增减结构体参数字段内容即可。 但同时还存在另外一种情况, …

设计测试用例的6种基本原则

设计测试用例的基本原则&#xff0c;对于软件测试非常重要&#xff0c;这些原则有助于设计出高质量、全面、有效的测试用例&#xff0c;从而提高软件测试的效率和准确性&#xff0c;维护软件的质量和稳定。如果在设计用例时没有遵循基本原则&#xff0c;这会影响用例的全面性、…

百望云斩获“新华信用金兰杯”ESG优秀案例 全面赋能企业绿色数字化

近年来&#xff0c;中国ESG蓬勃发展&#xff0c;在政策体系构建、ESG信披ESG投资和国际合作等方面都取得了阶段性成效&#xff0c;ESG生态不断完善。全社会对ESG的认识及实践也在不断深化&#xff0c;ESG实践者的队伍在不断发展壮大。 ESG作为识别企业高质量发展的重要指标&…

WebSocket魔法师:打造实时应用的无限可能

1、背景 在开发一些前端页面的时候&#xff0c;总是能接收到这样的需求&#xff1a;如何保持页面并实现自动更新数据呢&#xff1f;以往的常规做法&#xff0c;是前端使用定时轮询后端接口&#xff0c;获取响应后重新渲染前端页面&#xff0c;这种做法虽然能达到类似的效果&…

Rust6.1 Writing Automated Tests

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 11: Writing Automated Tests src/lib.rs //Tests: Arrange, Act, Assert //#[test] a…

二维码在区域巡查中的应用:隐患上报、巡逻巡更、管线巡查

针对管理制度不健全、维修不及时、纸质表格容易丢失等问题&#xff0c;可以在草料上搭建区域巡查二维码系统。通过组合功能模块的方式&#xff0c;实现扫码记录巡查情况、上报隐患和整改信息、发现异常问题后及时反馈给相关负责人等功能。 比如上海延吉物业管理有限公司搭建的…

uniapp的实战总结大全

&#x1f642;博主&#xff1a;冰海恋雨 &#x1f642;文章核心&#xff1a;uniapp部分总结 目录 ​编辑 目录 前言&#xff1a; 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xf…

在ant构建脚本中调用maven的命令

有时候想用maven管理依赖&#xff0c;用ant构建。 在ant的build.xml文件中可以使用exec这个task来调用系统命令&#xff0c;也就可以调用maven的命令。 例如&#xff0c;执行maven的命令mvn dependency:copy-dependencies&#xff0c;可以将项目的依赖提取出来&#xff0c;放…

Zookeeper 命令使用和数据说明

文章目录 一、概述二、命令使用2.1 登录 ZooKeeper2.2 ls 命令&#xff0c;查看目录树&#xff08;节点&#xff09;2.3 create 命令&#xff0c;创建节点2.4 delete 命令&#xff0c;删除节点2.5 set 命令&#xff0c;设置节点数据2.6 get 命令&#xff0c;获取节点数据 三、数…

时间序列基础->数据标签、数据分割器、数据加载器的定义和讲解(零基础入门时间序列)

一、本文介绍 各位小伙伴好&#xff0c;最近在发时间序列的实战案例中总是有一些朋友问我时间序列中的部分对数据的操作是什么含义&#xff0c;我进行了挺多的介绍和讲解但是问的人越来越多&#xff0c;所以今天在这里单独发一篇文章来单独的讲一下时间序列中对数据的处理操作…

AOMedia发布免版税沉浸音频规范IAMF

11月10日&#xff0c;开放媒体联盟&#xff08;AOMedia&#xff09;发布了旗下首个沉浸式音频规范IAMF&#xff08;https://aomediacodec.github.io/iamf/&#xff09;&#xff0c;IAMF是一种编解码器无关的容器规范&#xff0c;可以携带回放时间渲染算法和音频混音的信息&…

矩阵置零00

题目链接 矩阵置零 题目描述 注意点 使用 原地 算法 解答思路 思路是需要存储每一行以及每一列是否有0&#xff0c;因为要尽可能使用更少的空间&#xff0c;且新设置为0的格子不能对后续的判断产生影响&#xff0c;所以要在原有矩阵上存储该信息先用两个参数存储第一行和第…

ARMday06(串口)

代码&#xff1a; #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h"void delay_ms(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j);} } void init(); char getc(); void putc(char data); vo…

ISP图像处理Pipeline

参考&#xff1a;1. 键盘摄影(七)——深入理解图像信号处理器 ISP2. Understanding ISP Pipeline3. ISP图像处理流程介绍4. ISP系统综述5. ISP(图像信号处理)之——图像处理概述6. ISP 框架7. ISP(图像信号处理)算法概述、工作原理、架构、处理流程8. ISP全流程简介9. ISP流程介…

《视觉SLAM十四讲》-- 后端 1(上)

文章目录 08 后端 18.1 概述8.1.1 状态估计的概率解释8.1.2 线性系统和卡尔曼滤波&#xff08;KF&#xff09;8.1.3 非线性系统和扩展卡尔曼滤波&#xff08;EKF&#xff09;8.1.4 小结 08 后端 1 前端视觉里程计可以给出一个短时间内的轨迹和地图&#xff0c;但由于不可避免的…

GPT 写作与改编

GPT 写作与改编 文商科GPT 写作收益 改编技巧【改编一段话】【改编评价】【意识预设】落差&#xff0c;让顾客看到就感性和冲动害怕&#xff0c;让顾客看到就想买和拥有画面&#xff0c;切换空间&#xff0c;瞬间代入&#xff0c;勾人魂魄对比&#xff0c;设置参考物&#xff0…

保序回归:拯救你的校准曲线(APP)

保序回归&#xff1a;拯救你的校准曲线&#xff08;APP&#xff09; 校准曲线之所以是评价模型效能的重要指标是因为&#xff0c;校准曲线衡量模型预测概率与实际发生概率之间的一致性&#xff0c;它可以帮助我们了解模型的预测结果是否可信。一个理想的模型应该能够准确地预测…