AI教我学编程之C#类的基本概念(1)

news2024/12/22 23:47:05

前言

在AI教我学编程之C#类型 中,我们学习了C#类型的的基础知识,而正是类型的一种.

目录

  • 区分类和类型

    • 什么是类?
    • 对话AI
    • 追问
    • 实操
  • 追踪属性的使用

    • AI登场
    • 逐步推进
    • 提出疑问
    • 药不能停
    • 终于实现
  • 探索事件的使用

    • 异步/交互操作
    • 耗时操作
    • 提示
  • 总结

区分类和类型

在 C# 中,类是类型的一种。C# 是一种面向对象的编程语言,它的类型系统分为值类型和引用类型。类属于引用类型的范畴,因为它是用户定义的引用类型。

什么是类?

或者说,什么样的构造可以称之为类?
在菜鸟教程上我们可以看到这段话
在这里插入图片描述
我们来看看AI对此会如何回答?

对话AI

程序员

什么样的构造可以称之为类?

在这里插入图片描述

在面向对象编程中,一个类是一个用于创建对象的蓝图或模板。一个类可以包含以下元素:

  1. 成员变量(字段): 用于存储对象的状态或属性。

    class Person
    {
        // 成员变量
        public string Name;
        public int Age;
    }
    
  2. 成员方法: 用于定义对象的行为或操作。

    class Person
    {
        // 成员方法
        public void DisplayInfo()
        {
            Console.WriteLine($"Name: {Name}, Age: {Age}");
        }
    }
    
  3. 构造函数: 用于初始化对象的特定状态。

    class Person
    {
        // 成员变量
        public string Name;
        public int Age;
    
        // 构造函数
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
    
  4. 属性(可选): 提供对成员变量的访问和修改的公共接口。

    class Person
    {
        // 自动属性
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
  5. 事件(可选): 允许对象发布和订阅事件。

    class Button
    {
        // 事件
        public event EventHandler Click;
    
        // 触发事件的方法
        protected virtual void OnClick(EventArgs e)
        {
            Click?.Invoke(this, e);
        }
    }
    

一个类的目的是封装数据和行为,通过创建对象的实例来使用这些数据和行为。上述元素的组合形成了一个完整的类定义。在使用类时,你可以实例化它并调用其中的方法,访问或修改成员变量等。

首先我们看到这几段代码都以class关键字作为开始,就是说,这段代码表示是由class关键字开始,名称为person,由以下三个元素组成

  • 成员变量:
    • Name:用于存储人员的名字。
    • Age:用于存储人员的年龄。
  • 构造函数:
    public Person(string name, int age):构造函数用于在创建 Person 类的实例时初始化对象的状态(名字和年龄)。
  • 成员方法:
    DisplayInfo():成员方法用于显示人员的名字和年龄信息。

那么剩下两个可选项是做什么的呢?我们接着往下看

追问

程序员

你刚刚列出了两个可选项,属性和事件,为什么这两个只是可选项?

在这里插入图片描述

属性和事件在类的设计中是可选的,而不是必需的,这取决于你的设计需求。下面是关于为什么它们是可选项的一些解释:

  1. 属性(Properties):

    • 作用: 属性提供了一种用于访问和修改类的成员变量的公共接口。它们允许你在读取或写入属性值时执行逻辑,并且可以隐藏实际的字段实现。
    • 为何是可选: 有时,一个简单的公共字段足以满足类的需求,而不需要额外的逻辑。在这种情况下,你可以选择跳过属性的使用。
    class Person
    {
        // 公共字段
        public string Name;
        public int Age;
    }
    

    或者使用属性:

    class Person
    {
        // 属性
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
  2. 事件(Events):

    • 作用: 事件允许类发布和订阅特定的行为,通常与异步编程和观察者模式有关。
    • 为何是可选: 如果你的类不需要定义或响应外部的事件,那么你可以省略事件的使用。事件通常在需要处理异步或交互式操作时使用,而在其他情况下可能不是必需的。
    class Button
    {
        // 事件
        public event EventHandler Click;
    
        // 触发事件的方法
        protected virtual void OnClick(EventArgs e)
        {
            Click?.Invoke(this, e);
        }
    }
    

因此,可选性提供了灵活性,使得类的设计能够根据具体需求进行调整,而不必强制要求每个类都具有属性和事件。

为更加直观理解这两个概念,我们来实操一下

实操

1、打开Visual Studio (我的是2010,在这里就用2010来演示)
在这里插入图片描述
2、新建项目
在这里插入图片描述
3、模板选择visual C# Windows—> Windows窗体应用
在这里插入图片描述
4、起好名后进入以下页面
提示:千万别忘了命名规范 哦!

在这里插入图片描述
5、点击左侧边栏工具箱
在这里插入图片描述
6、我们看到工具箱把窗体覆盖住了
在这里插入图片描述
7、不用担心,点击工具箱右上角的倒三角,选择停靠,这样就可以正常显示了
在这里插入图片描述
8、选择工具箱中的工作控件“按钮”,拖动到窗体上
在这里插入图片描述
9、右击按钮,选择属性,我们可以在右下角看到属性栏
在这里插入图片描述

此时,不管我们拖动什么控件到窗体中,单击控件或者窗体,即可看它的属性

在这里插入图片描述

让我们回到刚刚的问题,为什么属性事件可选的?
AI的回答是:在不需要额外逻辑的情况下,可以跳过属性的使用

追踪属性的使用

1、双击按钮进入如下页面
在这里插入图片描述

AI登场

程序员

以上这段代码中,有个按钮,我需要根据这段代码实现点击按钮跳出"青青草原我最狂,舍我其谁懒大王!"的提示文字

在这里插入图片描述

要在点击按钮时弹出提示文字,你需要在 button1_Click 事件处理方法中添加相应的代码。以下是修改后的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 在按钮点击事件中添加代码
            MessageBox.Show("青青草原我最狂,舍我其谁懒大王!");
        }
    }
}

在这个修改后的代码中,当 button1 被点击时,button1_Click 事件处理方法会弹出一个消息框(MessageBox),显示指定的提示文字。 MessageBox.Show 方法用于在 Windows 窗体应用程序中显示一个简单的消息框。

如下图所示,点击debug旁边的绿色三角开启调试
在这里插入图片描述
画面左上角我们看到,项目正在运行
在这里插入图片描述
点击按钮,跳出提示
在这里插入图片描述

逐步推进

程序员

现在我需要你在代码中添加类的属性的使用

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        // 新增的属性
        public string Name { get; set; }
        public int Age { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 在按钮点击事件中使用属性
            Name = "青青草原我最狂";
            Age = 25;

            // 弹出消息框显示属性值
            MessageBox.Show($"姓名:{Name}\n年龄:{Age}\n舍我其谁懒大王!");
        }
    }
}

在这个示例中,我添加了两个属性 NameAge,并在按钮点击事件中给它们赋值。然后,通过MessageBox.Show方法显示属性的值。这个例子演示了如何在类中使用属性,以便存储和获取对象的状态。

提出疑问

程序员

这段代码中属性的使用是必须的吗?

在这里插入图片描述

在给定的代码示例中,属性的使用并不是必需的。在C#中,属性是用于封装对象的状态并提供对其进行访问和修改的公共接口的一种方式。在一些情况下,你可能不需要使用属性,尤其是当类的成员变量(字段)可以直接访问而不需要额外的逻辑时。

在给定的代码示例中,如果你只是在按钮点击事件中使用了一次 Name 和 Age,并且没有其他需要对这些值进行封装或加入逻辑的地方,那么使用属性是可选的。你可以直接在 button1_Click 事件中声明局部变量来存储这些值,而无需将它们定义为属性。

以下是示例,演示如何在不使用属性的情况下直接声明并使用局部变量:

using System;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 直接声明和使用局部变量
            string name = "青青草原我最狂";
            int age = 25;

            // 弹出消息框显示变量值
            MessageBox.Show($"姓名:{name}\n年龄:{age}\n舍我其谁懒大王!");
        }
    }
}

在这个例子中,我直接在 button1_Click 事件中声明了局部变量 name 和 age,并使用它们存储和显示信息,而没有使用属性。

药不能停

紧接着我补充道
程序员

我需要你添加的是必需的属性,根据原有代码重新添加

在这里插入图片描述

如果你希望使用属性,我会在代码中重新添加必需的属性。以下是在原有代码基础上添加必需的属性的修改版本:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        // 必需的属性
        public string Name { get; set; }
        public int Age { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 在按钮点击事件中使用属性
            Name = "青青草原我最狂";
            Age = 25;

            // 弹出消息框显示属性值
            MessageBox.Show($"姓名:{Name}\n年龄:{Age}\n舍我其谁懒大王!");
        }
    }
}

在这个修改后的代码中,我添加了两个名为 Name 和 Age 的属性。这样,你可以在类的其他地方使用这些属性,而不仅仅是在 button1_Click 事件中。这种封装的方式提高了代码的可维护性和灵活性。

终于实现

程序员

根据现有代码写两段代码,第一段代码即原代码,另一段代码则必须使用属性才能实现其逻辑和功能

在这里插入图片描述

代码段一:不使用属性,直接声明并使用局部变量

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        // 必需的属性
        public string Name { get; set; }
        public int Age { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 在按钮点击事件中使用属性
            Name = "青青草原我最狂";
            Age = 25;

            // 弹出消息框显示属性值
            MessageBox.Show($"姓名:{Name}\n年龄:{Age}\n舍我其谁懒大王!");
        }
    }
}

代码段二:使用属性实现逻辑和功能

在这个示例中,我添加了一些逻辑和功能,并使用属性来存储和访问数据:

using System;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        // 使用属性
        public string Name { get; set; }
        public int Age { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 使用属性存储数据
            Name = "青青草原我最狂";
            Age = 25;

            // 调用带有逻辑的方法
            DisplayInfo();

            // 弹出消息框显示属性值
            MessageBox.Show($"姓名:{Name}\n年龄:{Age}\n舍我其谁懒大王!");
        }

        // 带有逻辑的方法
        private void DisplayInfo()
        {
            Console.WriteLine($"在 DisplayInfo 方法中:姓名:{Name},年龄:{Age}");
            // 可以在这里添加更多的逻辑和功能
        }
    }
}

在这个示例中,button1_Click 事件使用属性 NameAge 存储数据,然后调用了一个带有逻辑的方法 DisplayInfo。在这个方法中,你可以添加更多的逻辑和功能。这种方式充分利用了属性的封装性,使得逻辑更加清晰和可维护。

这里的DisplayInfo方法,就是AI刚刚提到的可以填充额外的逻辑的地方

探索事件的使用

异步/交互操作

程序员

我现在需要在原代码中可以”处理异步或交互式操作“,据此要求完善代码

在这里插入图片描述

如果你想要在原有代码中处理异步或交互式操作,可以使用异步方法和 async/await 关键字。下面是对原有代码的修改,使其能够处理异步操作:

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        // 使用属性
        public string Name { get; set; }
        public int Age { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            // 使用属性存储数据
            Name = "青青草原我最狂";
            Age = 25;

            // 异步操作
            await DisplayInfoAsync();

            // 弹出消息框显示属性值
            MessageBox.Show($"姓名:{Name}\n年龄:{Age}\n舍我其谁懒大王!");
        }

        // 异步方法
        private async Task DisplayInfoAsync()
        {
            // 异步操作,模拟耗时操作
            await Task.Delay(2000);

            // 在异步方法中使用属性
            Console.WriteLine($"在 DisplayInfoAsync 方法中:姓名:{Name},年龄:{Age}");
            // 可以在这里添加更多的异步操作
        }
    }
}

在这个示例中,我将 DisplayInfo 方法改为 DisplayInfoAsync,并在其内部添加了一个异步操作 await Task.Delay(2000) 以模拟耗时操作。同时,button1_Click 事件也被标记为 async,并在其中使用了 await 关键字来等待异步方法的完成。这样,你可以在异步方法中执行可能涉及等待的耗时操作,而不会阻塞主线程。

耗时操作

程序员

在你刚才给出的代码中,可以执行哪些”耗时操作“,告诉我,并且将这个操作添加到代码中,使我在调试时可以明显的看到”耗时“这一效果

在这里插入图片描述

在我之前提供的代码示例中,我添加了一个模拟耗时操作的异步方法 DisplayInfoAsync,其中使用了 await Task.Delay(2000) 来模拟一个持续两秒的异步操作。这个延迟操作是一个简单的例子,用来模拟可能的耗时操作。

在实际的应用中,你可以将异步方法中的 Task.Delay 替换为真实的耗时操作,比如从数据库中读取数据、进行网络请求、进行复杂的计算等。以下是对代码的修改,其中包含了一个更具体的耗时操作示例:

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FirstProject
{
    public partial class Form1 : Form
    {
        // 使用属性
        public string Name { get; set; }
        public int Age { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            // 使用属性存储数据
            Name = "青青草原我最狂";
            Age = 25;

            // 调用带有耗时操作的异步方法
            await DisplayInfoWithDelayAsync();

            // 弹出消息框显示属性值
            MessageBox.Show($"姓名:{Name}\n年龄:{Age}\n舍我其谁懒大王!");
        }

        // 带有耗时操作的异步方法
        private async Task DisplayInfoWithDelayAsync()
        {
            Console.WriteLine("开始执行耗时操作...");

            // 模拟从数据库中读取数据,等待2秒钟
            await Task.Delay(2000);

            // 在异步方法中使用属性
            Console.WriteLine($"在 DisplayInfoWithDelayAsync 方法中:姓名:{Name},年龄:{Age}");
            Console.WriteLine("耗时操作完成。");
        }
    }
}

在这个修改后的代码中,我添加了一段输出,用于在控制台中显示耗时操作的开始和结束。当你点击按钮时,可以在输出中看到开始和结束的标志,这段时间模拟了耗时操作的执行时间。在实际应用中,你可以将这里的 Task.Delay 替换为你真实的耗时操作。

提示

以上代码在VS2010中不可用,在VS2019及以上中可用

VS2010

在这里插入图片描述
VS2019
在这里插入图片描述
开启调试后,我们点击按钮

在这里插入图片描述
两秒钟后,跳出提示
在这里插入图片描述

总结

又是仓促的一天,现在上传的这个版本有些瑕疵,明天我会补好,感谢各位的阅读,喜欢本文的话,点赞收藏关注支持一下博主吧!感谢厚爱!
回到顶部

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

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

相关文章

全面分析vcomp140.dll丢失的修复方法,快速解决dll报错问题

vcomp140.dll文件的丢失可能会引发一系列系统运行和软件功能上的问题。作为Microsoft Visual C Redistributable Package的一部分,vcomp140.dll是一个至关重要的动态链接库文件,它的缺失可能导致某些应用程序无法正常启动或执行。具体来说,当…

今年想考CISP的一定要看完❗️

🎯国家注册信息安全专业人员(英文名称Certified Information Security Professional,简称“CISP"),是由中国信息安全测评中心于2002年推出的、业内公认的国内信息安全领域zqw的gj级认证,是国家对信息安…

【C++】list容器迭代器的模拟实现

list容器内部基本都是链表形式实现,这里的迭代器实现的逻辑需要注意C语言中指针的转换。 list容器如同数据结构中的队列,通常用链式结构进行存储。在这个容器中,我们可以模仿系统的逻辑,在头结点后设置一个“ 哨兵 ”,…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

阿里云优惠券领取入口、使用教程,2024优惠券更新

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…

CentOS 7安装全解析:适合初学者的指导

目录 前言 一.centos安装 1.下载镜像文件 2.安装 二.远程连接&#xff0c;换源 1.下载并且使用MobaXtermMobaXterm free Xserver and tabbed SSH client for Windows (mobatek.net)https://mobaxterm.mobatek.net/ 远程连接 2.换源 前言 在当今的信息化时代&#xff0c…

SpikingJelly笔记之IFLIF神经元

文章目录 前言一、脉冲神经元二、IF神经元1、神经元模型2、神经元仿真 三、LIF神经元1、神经元模型2、神经元仿真 总结 前言 记录整合发放(integrate-and-fire, IF)神经元与漏电整合发放(leaky integrate-and-fire, LIF)神经元模型&#xff0c;以及在SpikingJelly中的实现方法…

mybatis----动态Sql

1.if标签 通过if标签构建动态条件&#xff0c;通过其test属性的true或false来判断该添加语句是否执行。 mapper接口 public interface AccountMapper {List<Account> selectAllByCondition(Account account); } 映射文件 <select id"selectAllByCondition&q…

《文苑》文学艺术文化期刊投稿邮箱投稿方式

《文苑》杂志是国家新闻出版总署批准的正规期刊&#xff0c;本刊致力于中华优秀传统文化、文化旅游、文学艺术、哲学社会科学等方面的理论和实践研究&#xff0c;集理论性、艺术性、指导性于一体&#xff0c;是广大文化、哲学、社会科学工作者交流科研成果、传递学术思想的重要…

(蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)

能够表示为某个整数的平方的数字称为“平方数 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。因为平方数的末位只可能是:0,1,4,5,6,9 这 6 个数字中的某个。所以&#xff0c;4325435332 必然不是平方数。 如果给你一个 2 位或 2 位以上的数字&am…

【Linux】基本指令收尾

文章目录 日期查找打包压缩系统信息Linux和Windows互传文件 日期 这篇是基本指令的收尾了&#xff0c;还有几个基本指令我们需要说一下 首先是Date&#xff0c;它是用来显示时间和日期 直接输入date的话显示是有点不好看的&#xff0c;所以我们可以根据自己的喜欢加上分隔符&…

MATLAB解决考研数学一题型(上)

闲来无事&#xff0c;情感问题和考研结束后的戒断反应比较严重&#xff0c;最近没有什么写博文的动力&#xff0c;抽空来整理一下考研初试前一直想做的工作——整理一下MATLAB解决数学一各题型的命令~ 本贴的目录遵循同济版的高数目录~ 目录 一.函数与极限 1.计算双侧极限 2…

如何理解 GO 语言的接口 - 鸭子模型

个人认为&#xff0c;要理解 Go 的接口&#xff0c;一定先了解下鸭子模型。 鸭子模型 那什么鸭子模型&#xff1f; 鸭子模型的解释&#xff0c;通常会用了一个非常有趣的例子&#xff0c;一个东西究竟是不是鸭子&#xff0c;取决于它的能力。游泳起来像鸭子、叫起来也像鸭子…

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式&#xff0c;是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求&#xff0c;也为了充分利用服务器的资源&#xff0c;服务端需要…

Wimdows如何修改自己权限不够的文件

使用管理员身份运行cmd cd 文件目录 cd C:\Windows\System32\drivers\etc 打开文件 notepad 文件名 进行修改&#xff0c;保存就能成功&#xff01;

基于springboot+vue的教师工作量管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

部署Filebeat+Kafka+ELK 集群

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 在zookeeper集群的基础上部署 kafka 集群 部署zookeeper集群 部署kafka集群 下载安装包 安装 Kafka Ka…

Leetcode—22.括号生成【中等】

2023每日刷题&#xff08;七十九&#xff09; Leetcode—22.括号生成 算法思想 实现代码 class Solution { public:vector<string> generateParenthesis(int n) {vector<string> ans;int m n * 2;string path(m, 0);function<void(int, int)> dfs [&…

LabVIEW电火花线切割放电点位置

介绍了一个电火花线切割放电点位置分布评价系统&#xff0c;特别是在系统组成、硬件选择和LabVIEW软件应用方面。 本系统由两个主要部分组成&#xff1a;硬件和软件。硬件部分包括电流传感器、高速数据采集卡、开关电源、电阻和导线。软件部分则由LabVIEW编程环境构成&#xf…

数学建模学习笔记||层次分析法

评价类问题 解决评价类问题首先需要想到一下三个问题 我们评价的目标是什么我们为了达到这个目标有哪几种可行方案评价的准则或者说指标是什么 对于以上三个问题&#xff0c;我们可以根据题目中的背景材料&#xff0c;常识以及网上收集到的参考资料进行结合&#xff0c;从而筛…