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

前言

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

目录

  • 区分类和类型

    • 什么是类?
    • 什么是类型?
    • 追问
    • 实操
  • 总结

区分类和类型

在 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.mzph.cn/news/623342.shtml

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

相关文章

利用XSS漏洞打cookie

目录 1、为什么要打cookie? 2、怎样利用XSS来打cookie? 3、利用Bluelotus_xssReceiver平台来打cookie 4、利用beef-xss平台来打cookie 上一篇给大家介绍了xss漏洞的基础知识,在本篇章将会介绍和演示一下利用xss漏洞打cookie的演示&#x…

DAY8--learning english

一、积累 1.haunt Why Ghost dont haunt chinese. 为什么鬼不会出现在中国人旁边? 2.confess i have a confession to make ... I actally a blind. 我要坦白一件事……我其实是个盲人。 3.brake Press S button to brake, or to reverse if the vehicle has stopped, 按住…

android.os.NetworkOnMainThreadException

问题 android.os.NetworkOnMainThreadException详细问题 核心代码如下: import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ja…

30 3D导航栏

效果演示 实现了一个导航栏&#xff0c;其中包含了五个图标&#xff0c;每个图标都有一个悬浮的文字标签&#xff0c;当鼠标悬停在图标上时&#xff0c;文字标签会旋转并向上移动&#xff0c;同时底部会出现一个阴影效果。整个导航栏的背景颜色为浅灰色。 Code <ul><…

python 字典的基础及应用

当前版本&#xff1a; Python 3.8.4 简介 字典是一种无序的、可变的、键值对的数据结构。通常用于存储键值对&#xff0c;其中键是唯一的&#xff0c;值可以是任何类型的对象。它可以快速查找和访问数据&#xff0c;关联相互有关的信息&#xff0c;灵活地添加、修改和删除数据…

Day03

今日任务 链表理论基础203.移除链表元素707.设计链表206.反转链表 链表理论基础 1&#xff09;单链表 单链表中的指针域只能指向节点的下一个节点 2&#xff09;双链表 双链表&#xff1a;每一个节点有两个指针域&#xff0c;一个指向下一个节点&#xff0c;一个指向上一个…

k8s云原生环境搭建笔记——第二篇

目录 1、使用普通方式安装prometheus和grafana1.1、安装kube-state-metrics容器1.1.1、下载并修改yaml文件1.1.2、导入kube-state-metrics镜像1.1.3、执行yaml文件目录 1.2、安装node-exploer1.2.1、创建名称空间prometheus1.2.2、执行yaml 1.3、安装prometheus1.3.1、创建集群…

QT上位机开发(动画效果)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管是仿真&#xff0c;还是对真实环境的一比一模拟&#xff0c;动画都是非常好的一种呈现方式。目前在qt上面&#xff0c;实现动画主要有两种方法…

js(JavaScript)数据结构之堆(Heap)

什么是数据结构&#xff1f; 下面是维基百科的解释&#xff1a; 数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装&#xff1a;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 我们每天的编码中都会…

Linux scp命令 服务器之间通讯

目录 一. scp命令简介二. 本地服务器文件传输到远程服务器三. 本地服务器文件夹传输到远程服务器 一. scp命令简介 scp&#xff08;Secure Copy Protocol&#xff09;是用于在Unix或Linux系统之间安全地复制文件或目录的命令。 它使用SSH&#xff08;Secure Shell&#xff09;…

如何通过Burp Suite专业版构建CSRF PoC

Burp Suite是一款强大的渗透测试利器&#xff0c;可以利用它来高效的执行渗透攻击&#xff0c;接下来介绍如何通过Burp Suite Pro来构建CSRF PoC。 在Bupr中找到拦截的请求&#xff0c;右键选择Engagement tools > Generate CSRF PoC 利用CSRF PoC生成器自动生成HTML <h…

imgaug库指南(23):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

四、MySQL安装失败问题和可视化工具连接MySQL8问题

目录 安装问题1&#xff1a;无法打开MySQL8.0软件安装包&#xff1f; 安装问题2&#xff1a;需要C库 安装问题3&#xff1a;丢失MSVCP140.dll 可视化工具连接MySQL8问题 安装问题1&#xff1a;无法打开MySQL8.0软件安装包&#xff1f; 在运行MySQL8.0软件安装包之前&#xf…

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2CSPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR12.1 PWR简介12.2 修改主频1…

精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略

不多说&#xff0c;直接上效果如图&#xff1a; ► 日线表现 代码评估 技术指标代码评估&#xff1a; VAR1, VAR2, VAR3&#xff1a;这些变量是通过指数移动平均&#xff08;EMA&#xff09;计算得出的。EMA是一种常用的技术分析工具&#xff0c;用于平滑价格数据并减少市场“…

Linux/Traverxec

Enumeration nmap 使用nmap快速扫描目标&#xff0c;发现对外开放了22和80&#xff0c;第一个问题就是问80端口运行的是什么服务&#xff0c;针对这两个端口扫描对应的详细信息后就能得到答案 Nostromo 从nmap的扫描结果可以看到&#xff0c;目标开启了80端口&#xff0c;且…

《计算思维导论》笔记:10.2 什么是数据库与数据库系统?

《大学计算机—计算思维导论》&#xff08;战德臣 哈尔滨工业大学&#xff09; 《10.2 什么是数据库与数据库系统&#xff1f;》 数据库 简单来讲&#xff0c;数据库就是相互有关联关系的数据的集合。 一个表聚集了具有相同结构类型的若干个对象一行数据反映了某一对象的相关…

Leetcode3002. 移除后集合的最多元素数

Every day a Leetcode 题目来源&#xff1a;3002. 移除后集合的最多元素数 解法1&#xff1a;贪心 可以将数组去重后分为三个部分&#xff1a;nums1 独有的&#xff0c;nums2 独有的&#xff0c;nums1 与 nums2 共有的。 求集合 S 时&#xff1a; 先选择两个数组独有的。…

JVM:双亲委派机制类加载器

JVM&#xff1a;双亲委派机制 1. 例子2. 类加载器总结3. 类加载过程4. 双亲委派模型的执行流程&#xff1a;5. 双亲委派模型的好处 1. 例子 Java运行时环境有一个java.lang包&#xff0c;里面有一个ClassLoader类 我们自定义一个String类在java.lang包下&#xff0c;下面的…

C#编程-使用事件

使用事件 事件是一个动作或发生的事情,例如:鼠标点击、按键、鼠标移动或系统产生的通知。应用程序可以在事件发生的时候做出响应。通知的一个示例是中断。事件是对象发生的消息以表示事件的发生。事件是进程内通信的有效方法。它们对对象时有用的,因为它们标识了单个状态改…