当前位置: 首页 > news >正文

【2】VS Code 新建上位机项目---C#面向对象编程

VS Code 新建上位机项目---C#面向对象编程

  • 1 类与对象
    • 1.1 类的构成
    • 1.2 对象
  • 2 类的属性
    • 2.1 类的属性与类的字段
    • 2.2 类属性的拓展
    • 2.3 对象类型的属性
  • 3 构造方法(初始化)
    • 3.1 默认构造方法 无参数构造方法
    • 3.2 有参数构造方法
    • 3.3 构造方法相互调用( :this() )构造方法重载
    • 3.4 对象初始化器
  • 4 对象实例化方法
  • 5 垃圾回收机制(GC)
  • 6 静态方法(static)
  • 7 params关键字
  • 8 泛型集合
    • 8.1 基于索引的泛型集合 LIst<T>
      • 8.1.2 List<>的基本语法
      • 8.1.2 将List<>作为对象容器
    • 8.2 基于"键--值"对的泛型集合 Dictionary<k.v>

1 类与对象

1.1 类的构成

类通俗来讲,就是将目标对象进行分类。如何分类?
静态属性:是对象的基本特征信息。
动态方法:是描述对象能做什么,如何做。
类的规范:

访问修饰符 class 类的名称
{
   
//静态字段部分
//静态属性部分
//私有字段(一般不用)
//动态方法部分
}

一个类可以只有属性、只有方法、也可以属性、方法全部都有。不建议添加只有字段的类。

先新建一个空白项目,然后右键项目名称,添加,新建项,选择类,重新修改类名,点击添加;
在这里插入图片描述
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Thinger.ConsoleAndOperation
{
   
    /// <summary>
    /// 设备类
    /// </summary>
    public class Equipment //访问修饰符 class 类的名称
    {
   
        public int EquipID {
    get; set; }//属性1:设备ID
        //输入prop连续Tab两次可以自动复制上一行的代码结构
        public int EquipName {
    get; set; }//属性2:获取设备名称
        public double Pressure {
    get; set; }//属性3:压力
        public DateTime Collecttime {
    get; set; }//属性4:获取更新时间

        public void ShowInfo()//属性5:方法 显示信息
        {
   
            Console.WriteLine($"设备ID:{
     EquipID}");
        }
    }
}

tips:
【1】访问修饰符

public class Equipment //访问修饰符 class 类的名称

访问修饰符不写的时候,默认访问修饰符是internal,表示只能再当前程序集内部使用该类。public可以再程序集外面通过调用命名空间的方式使用。类的名称首字母要大写。

【2】get与set是一个方法。主要执行过程是先将对象的值set给类,类里面通过get读取这个数然后执行语句,在对象的位置显示。所以说get与set是方法, public int EquipID才是属性。

 public int EquipID {
    get; set; }//属性1:设备ID

找到路径下的ildasm.exe文件,双击运行,
在这里插入图片描述
右键程序集,选择再文件资源管理器中打开文件夹,C:\Users\wang\Desktop\Thinger.ConsoleAndOperation\Thinger.ConsoleAndOperation\bin\Debug,找到debug下面的.exe文件,将其直接拖到运行窗口ildasm.exe中,可以看到get与set的底层逻辑。查看完毕后,记得关闭ildasm.exe文件,否则会影响程序运行。
在这里插入图片描述
在这里插入图片描述

【3】类只是规定了,它能存储什么类型的数据、能够完成什么任务,但是没有具体的数据。类本身也是一种数据类型,有点像是西门子下位的UDT或者WINCC的结构体。他只有后缀,并不是一个完整的变量,因此需要对象来作为前缀,这样前缀+后缀就构成了一个完成的变量。所以想让类有具体的内容需要对象来进行填充。

1.2 对象

对象就是用类做模板,给类的属性赋值。

使用new关键字定义,会将类调到内存中,从而变成对象的实例。

类名 对象名 = new 类名();
对象名.属性 = 值;
对象名.方法(参数...)

回到progrpm.cs。

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Thinger.ConsoleAndOperation
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Equipment Equip = new Equipment();//根据类构建对象
            Equip.EquipID = 101;//给对象(Equip)的类(Equipment)中的属性(ID)赋值
            Equip.EquipName = "空气压缩机";//
            Equip.Pressure = 2.5;//下位机读取的数据
            Equip.Collecttime = Convert.ToDateTime("2025-2-24");//
            Equip.ShowInfo();//显示信息

            Equipment Equip2 = new Equipment();//根据类构建了一个对象
            Equip2.EquipID = 102;//给对象(Equip)的类(Equipment)中的属性(ID)赋值
            Equip2.EquipName = "空气压缩机";
            Equip2.Pressure = 2.6;//下位机读取的数据
            Equip2.Collecttime = Convert.ToDateTime("2025-2-24");
            Equip2.ShowInfo();//显示

            Console.ReadLine();//调用控制台
        }        
    }
}

在这里插入图片描述

2 类的属性

2.1 类的属性与类的字段

【1】字段,又称为“成员变量”
第一、目的:字段是为类的内部方法,或者方法之间传递数据使用,强调对内使用。交修饰:字段一般用private修饰,很少用public。
第三、读写:字段可以读写均可,也可以用readonly限制为只读,但是不能添加业务。
【2】属性
第一、目的:属性是对外提供数据访问、本地不保数据,强调对外使
第二、修饰:属性都是public,从来不用private。
第三、读写:属性可以轻松的实现单独读写控制,并且可以添加任意需要的业务逻辑。
第四、强制:dgv列表必须强制使用属性,不能使用公有字段。

namespace Thinger.ConsoleAndOperation
{
   
    /// <summary>
    /// 设备信息类
    /// </summary>
    public class Equipment2
    {
   
        public int EquipID {
    get; set; } //属性可读可写,外部可以调用
        // public int EquipID;//公用字段,不要使用
       
        private int _equipid = 0;//私有字段
        public int EquiplD//使用私有字段进行逻辑判断,只能在当前类使用
        {
   
            get {
    return _equipid; }
            set {
    if (value < 100) _equipid = 100; else _equipid = value; }
        }
        
        private string equipname= string.Empty;//私有字段
        public string EquipName 
        {
    get {
    return equipname; }
          set {
    equipname = value; }
        }

        //只读属性
        public double Pressure 
        {
    get
            {
   
                double result = 2.5;
                return result;
            }
        }

        public DateTime Collecttime {
    get; set; }

        public void ShowInfo()
        {
   
            Console.WriteLine($"设备ID:{
     EquipID},设备名称:{
     EquipName}");
        }
    }
}

2.2 类属性的拓展

【1】类属性直接初始化

public int EquipID {
    get; set; } = 101;//直接赋值初始化

【2】类属性表达式
在这里插入图片描述
补充:使用属性的时候,有的地方也可以用方法代,但是设计的时候,如果你侧重的是属性(比如需要在dgv中显示)就要用属性,如果是单独的行为,可以用方法。

2.3 对象类型的属性

类是一种数据类型(引用类型),类中的属性和变量(局部变量和成员变量)也可以是类,开发中还会出现集合对象或者数组对象类型。

新建一个新的类,命名Equipment4表示设备,再新建一个类命名Sensor表示传感器,访问修饰符均选择public。

在Sensor类中:

 public  class Sensor
   {
   
       public int SensorNO {
    get; set; }//传感器编号
       public double SensorTemp {
    get; set; }//传感器温度
   }

在Equipment4类中:

public Sensor CurrentSensor {
    get; set; }//一个设备只有一个传感器
public Sensor[] CurrentSensorArray {
    get; set; }//一个设备有多个传感器,这就是对象类型的属性

在对象Program中:

static void Test3()
{
   
//一个对象Equip4设备其类 Equipment4包括CurrentSensor属性,这个属性又作为对象包括SensorNO和SensorTemp属性
    Equipment4 Equip4 = new Equipment4();//定义新对象Equip4其属性类是Equipment4
    Sensor sensor = new Sensor();//定义对象属性sensor其属性类是Sensor
    sensor.SensorNO = 1; //给对象属性ID赋值
    sensor.SensorTemp = 26.6; //给对象属性TEMP赋值
    Equip4.CurrentSensor = sensor;//给对象的CurrentSensor属性赋值
    Console.WriteLine(

相关文章:

  • IDEA中.gitignore未忽略指定文件的问题排查与解决
  • J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答
  • 【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现
  • YOLOv8+QT搭建目标检测项目
  • 推荐3个背景渐变色的wordpress主题
  • 深度生成模型(一)——具身智能综述与算法分类简介
  • 一劳永逸解决vsocde模块import引用问题
  • smolagents学习笔记系列(番外一)使用DeepSeek API Key + CodeAgent
  • 有没有什么免费的AI工具可以帮忙做简单的ppt?
  • 串口解析的服务器流程优化
  • javaweb文件上传:@MultipartConfig注解与Apache Commons FileUpload对比
  • 建筑兔零基础自学python记录32|学过的函数代码记录19-25
  • 判断一个文件中以三个#号开头有多少行的shell脚本怎么写
  • C语言(15)-------------->一维数组
  • Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制
  • 【音视频】编解码相关概念总结
  • 什么是Ollama?什么是GGUF?二者之间有什么关系?
  • gRPG协议
  • 【已解决】JupyterLab:如何在JupyterLab中切换内核
  • 【Linux网络】数据链路层 其他常见的协议
  • 专家:炎症性肠病发病率上升,需加强疾病早期诊断
  • A股午后回暖,三大股指涨跌互现:港口板块重新走强,两市成交近1.1万亿元
  • 俄需要达成怎样的特别军事行动结果?普京:包含四个方面
  • 见微知沪|科学既要勇攀高峰,又要放低身段
  • 《风林火山》千呼万唤始出来,戛纳首映后口碑崩盘?
  • “朱雀玄武敕令”改名“周乔治华盛顿”?警方称未通过审核