WPF学习(2)--类与类的继承2-在窗口的实现

一、代码分析

1.Animal.cs

1.1 代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AnimalNamespace
{public class Animal{public string Name { get; set; }public int Age { get; set; }public Animal (string name,int age){Name = name;Age = age;}public virtual string 吃饭(){return "我要吃饭";}public virtual string Makesound(){return "animal sound";}public override string ToString(){return $"{Name} (Age:{Age})";}}
}

1.2 代码分析

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

解释:这些 using 指令用于引入命名空间,允许你使用这些命名空间中定义的类和方法。System 包含基本的系统功能,Collections.Generic 提供泛型集合类,Linq 用于查询操作,Text 提供处理文本的类,Threading.Tasks 提供并行编程类。

namespace AnimalNamespace
{

解释:定义一个命名空间 AnimalNamespace,用于组织代码并避免命名冲突。在这个命名空间内定义的所有类和方法都属于这个命名空间。

    public class Animal{

解释:定义一个公共类 Animalpublic 关键字表示这个类可以被其他命名空间中的代码访问。

        public string Name { get; set; }

解释:定义一个公共属性 Namestring 是数据类型,表示这个属性存储字符串。{ get; set; } 是属性访问器,表示这个属性可以被读取和写入。

        public int Age { get; set; }

解释:定义一个公共属性 Ageint 是数据类型,表示这个属性存储整数。{ get; set; } 同样表示这个属性可以被读取和写入。

        public Animal(string name, int age){Name = name;Age = age;}

解释:定义一个构造函数 Animal。构造函数是一个特殊的方法,在创建类的实例时调用。public 关键字表示这个构造函数可以被其他代码调用。参数 string nameint age 用于初始化 NameAge 属性。

        public virtual string 吃饭(){return "我要吃饭";}

解释:定义一个公共的虚方法 吃饭,返回类型为 stringvirtual 关键字表示这个方法可以在派生类中被重写。方法体返回一个字符串 "我要吃饭"

        public virtual string Makesound(){return "animal sound";}

解释:定义另一个公共的虚方法 Makesound,返回类型为 string。方法体返回一个字符串 "animal sound"

        public override string ToString(){return $"{Name} (Age:{Age})";}

解释:重写基类 ObjectToString 方法。override 关键字表示这是一个重写的方法。方法体返回一个格式化的字符串,包含 NameAge 属性的值。$"{Name} (Age:{Age})" 是 C# 6.0 引入的字符串插值语法,允许在字符串中嵌入表达式。

2.DOG.cs

2.1 代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AnimalNamespace
{public class Dog:Animal{public Dog(string name, int age) : base(name, age) { }public override string Makesound(){return "汪汪!";}public override string 吃饭(){return "我要啃骨头";}}
}

2.2 代码解释

    public class Dog : Animal{

解释:定义一个公共类 Dog,它继承自 Animal 类。public 关键字表示这个类可以被其他命名空间中的代码访问。: 表示继承关系,Dog 类继承自 Animal 类,意味着 Dog 类将具有 Animal 类的所有属性和方法。

        public Dog(string name, int age) : base(name, age) { }

解释:定义一个构造函数 Dog,它接受两个参数 nameage,并将它们传递给基类 Animal 的构造函数。base(name, age) 调用基类的构造函数以初始化继承自基类的 NameAge 属性。

        public override string Makesound(){return "汪汪!";}

解释:重写基类 Animal 的虚方法 Makesoundoverride 关键字表示这是一个重写的方法。这个方法返回一个字符串 "汪汪!"

        public override string 吃饭(){return "我要啃骨头";}

解释:重写基类 Animal 的虚方法 吃饭。这个方法返回一个字符串 "我要啃骨头"

3.CAT.cs

3.1 代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AnimalNamespace
{public class Cat:Animal{public Cat(string Name, int age):base(Name, age){ }public override string Makesound(){return "喵喵";}}
}

3.2 代码解释

同DOG.cs

4.MainWindow.xaml.cs

4.1 代码

using System.ComponentModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using AnimalNamespace;namespace WpfApp2
{public partial class MainWindow : Window{List<Animal> Zoo;private 我的实验 MyText;public MainWindow(){InitializeComponent();Zoo = new List<Animal>();MyText=new 我的实验();MyText.显示串 = "";DataContext = new { 我的实验 = MyText };}private void Button_Click(object sender, RoutedEventArgs e){Dog x = new Dog("dog" + DateTime.Now.Second.ToString(), DateTime.Now.Second);Zoo.Add(x);}private void Button_Click_1(object sender, RoutedEventArgs e){Cat x = new Cat("cat" + DateTime.Now.Second.ToString(), DateTime.Now.Second);Zoo.Add(x);}private void Button_Click_2(object sender, RoutedEventArgs e){string 叫声 = "";foreach (Animal animal in Zoo){if (animal != null){叫声+=animal .Name +":"+ animal.Makesound()+ ":"+animal.吃饭();叫声 += Environment.NewLine;}}MyText.显示串 = 叫声;}}public class 我的实验 : INotifyPropertyChanged{private string _显示串;public string 显示串{get { return _显示串; }set{_显示串 = value;OnPropertyChanged("显示串");}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}
}

4.2 代码解释

    public partial class MainWindow : Window{

解释:定义一个公共的部分类 MainWindow,继承自 Window 类。这个类是 WPF 应用程序的主窗口。

        List<Animal> Zoo;private 我的实验 MyText;

解释:定义一个 Zoo 列表,用于存储 Animal 类的实例。定义一个私有字段 MyText,类型为 我的实验,用于数据绑定。

        public MainWindow(){InitializeComponent();Zoo = new List<Animal>();MyText = new 我的实验();MyText.显示串 = "";DataContext = new { 我的实验 = MyText };}

解释:定义 MainWindow 的构造函数。

  • InitializeComponent():初始化组件,加载 XAML 中定义的 UI 元素。
  • Zoo = new List<Animal>():初始化 Zoo 列表。
  • MyText = new 我的实验():初始化 MyText 实例。
  • MyText.显示串 = "":将 MyText显示串 属性初始化为空字符串。
  • DataContext = new { 我的实验 = MyText }:设置数据上下文,用于数据绑定。
        private void Button_Click(object sender, RoutedEventArgs e){Dog x = new Dog("dog" + DateTime.Now.Second.ToString(), DateTime.Now.Second);Zoo.Add(x);}

解释:定义一个按钮点击事件处理方法 Button_Click

  • Dog x = new Dog("dog" + DateTime.Now.Second.ToString(), DateTime.Now.Second):创建一个新的 Dog 实例,名字包括当前秒数。
  • Zoo.Add(x):将新创建的 Dog 实例添加到 Zoo 列表中。
        private void Button_Click_1(object sender, RoutedEventArgs e){Cat x = new Cat("cat" + DateTime.Now.Second.ToString(), DateTime.Now.Second);Zoo.Add(x);}

解释:定义另一个按钮点击事件处理方法 Button_Click_1

  • Cat x = new Cat("cat" + DateTime.Now.Second.ToString(), DateTime.Now.Second):创建一个新的 Cat 实例,名字包括当前秒数。
  • Zoo.Add(x):将新创建的 Cat 实例添加到 Zoo 列表中。
        private void Button_Click_2(object sender, RoutedEventArgs e){string 叫声 = "";foreach (Animal animal in Zoo){if (animal != null){叫声 += animal.Name + ":" + animal.Makesound() + ":" + animal.吃饭();叫声 += Environment.NewLine;}}MyText.显示串 = 叫声;}

解释:定义第三个按钮点击事件处理方法 Button_Click_2

  • string 叫声 = "":初始化一个空字符串 叫声
  • foreach (Animal animal in Zoo):遍历 Zoo 列表中的每个 Animal 实例。
  • if (animal != null):检查 animal 是否不为 null
  • 叫声 += animal.Name + ":" + animal.Makesound() + ":" + animal.吃饭():将 animal 的名字、叫声和吃饭行为添加到 叫声 字符串中。
  • 叫声 += Environment.NewLine:添加换行符。
  • MyText.显示串 = 叫声:更新 MyText显示串 属性。
    public class 我的实验 : INotifyPropertyChanged{

解释:定义一个公共类 我的实验,实现 INotifyPropertyChanged 接口。这个接口用于通知属性值的更改。

        private string _显示串;public string 显示串{get { return _显示串; }set{_显示串 = value;OnPropertyChanged("显示串");}}

解释:定义一个私有字段 _显示串 和一个公共属性 显示串

  • get { return _显示串; }:返回 _显示串 的值。
  • set { _显示串 = value; OnPropertyChanged("显示串"); }:设置 _显示串 的值,并调用 OnPropertyChanged("显示串") 方法通知属性值的更改。
        public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}

解释

  • public event PropertyChangedEventHandler PropertyChanged:定义一个 PropertyChanged 事件,用于通知属性值的更改。
  • protected virtual void OnPropertyChanged(string propertyName):定义一个受保护的虚方法 OnPropertyChanged,用于触发 PropertyChanged 事件。
  • PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)):如果 PropertyChanged 事件不为空,则触发该事件,并传递 propertyName 参数。

5.MainWindow.xaml

5.1 代码

<Window x:Class="WpfApp2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp2"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><Button Content="DOG" HorizontalAlignment="Left" Height="67" Margin="71,49,0,0" VerticalAlignment="Top" Width="120" Click="Button_Click"/><Button Content="CAT" HorizontalAlignment="Left" Height="67" Margin="212,49,0,0" VerticalAlignment="Top" Width="120" Click="Button_Click_1"/><Button Content="MAKESOUND" HorizontalAlignment="Left" Height="67" Margin="355,49,0,0" VerticalAlignment="Top" Width="120" Click="Button_Click_2"/><TextBlock x:Name="OutputTextBlock" HorizontalAlignment="Left" Height="183" Margin="71,140,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="404" FontSize="16"Text="{Binding 我的实验.显示串}"  /></Grid>
</Window>

5.2 代码解释

<Window x:Class="WpfApp2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp2"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800">

解释

  • <Window> 标签定义了一个 WPF 窗口。
  • x:Class="WpfApp2.MainWindow":指定这个窗口的关联类是 WpfApp2.MainWindow
  • xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation":定义 XAML 的默认命名空间,用于 WPF 控件。
  • xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml":定义 XAML 的 X 命名空间,用于 XAML 语言功能。
  • xmlns:d="http://schemas.microsoft.com/expression/blend/2008":定义设计时支持的命名空间。
  • xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006":定义标记兼容性的命名空间。
  • xmlns:local="clr-namespace:WpfApp2":定义本地命名空间 WpfApp2,用于引用同一个命名空间内的类型。
  • mc:Ignorable="d":指示设计时命名空间中的内容在运行时可以忽略。
  • Title="MainWindow":设置窗口的标题为 "MainWindow"。
  • Height="450"Width="800":设置窗口的高度为 450 像素,宽度为 800 像素。
    <Grid><Button Content="DOG" HorizontalAlignment="Left" Height="67" Margin="71,49,0,0" VerticalAlignment="Top" Width="120" Click="Button_Click"/><Button Content="CAT" HorizontalAlignment="Left" Height="67" Margin="212,49,0,0" VerticalAlignment="Top" Width="120" Click="Button_Click_1"/><Button Content="MAKESOUND" HorizontalAlignment="Left" Height="67" Margin="355,49,0,0" VerticalAlignment="Top" Width="120" Click="Button_Click_2"/><TextBlock x:Name="OutputTextBlock" HorizontalAlignment="Left" Height="183" Margin="71,140,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="404" FontSize="16"Text="{Binding 我的实验.显示串}"  /></Grid>
</Window>

解释

  • <Grid>:定义一个网格布局容器,用于组织其子元素。

  • <Button>:定义一个按钮控件。

    • Content="DOG":按钮上的文本为 "DOG"。
    • HorizontalAlignment="Left":按钮水平左对齐。
    • Height="67":按钮高度为 67 像素。
    • Margin="71,49,0,0":按钮的外边距,分别是左、上、右、下(左边距 71 像素,上边距 49 像素)。
    • VerticalAlignment="Top":按钮垂直顶部对齐。
    • Width="120":按钮宽度为 120 像素。
    • Click="Button_Click":单击按钮时调用 Button_Click 方法。
  • 第二个 <Button> 控件类似,只是内容为 "CAT",外边距不同(左边距 212 像素),单击事件处理方法为 Button_Click_1

  • 第三个 <Button> 控件内容为 "MAKESOUND",外边距不同(左边距 355 像素),单击事件处理方法为 Button_Click_2

  • <TextBlock>:定义一个文本块控件,用于显示文本。

    • x:Name="OutputTextBlock":设置控件的名称为 OutputTextBlock
    • HorizontalAlignment="Left":文本块水平左对齐。
    • Height="183":文本块高度为 183 像素。
    • Margin="71,140,0,0":文本块的外边距,分别是左、上、右、下(左边距 71 像素,上边距 140 像素)。
    • TextWrapping="Wrap":文本自动换行。
    • VerticalAlignment="Top":文本块垂直顶部对齐。
    • Width="404":文本块宽度为 404 像素。
    • FontSize="16":文本块的字体大小为 16 像素。
    • Text="{Binding 我的实验.显示串}":通过数据绑定将 我的实验 类的 显示串 属性绑定到文本块的文本属性。

二、实验结果

在这个过程中我依次点击了2次DOG、1次CAT、1次DOG、1次CAT,最后点击MAKESOUND使它们发出相同的行为,结果如下。

总结

这个项目通过 WPF (Windows Presentation Foundation) 实现了一个简单的动物管理应用程序,具有以下功能:

  1. 界面布局

    • 主窗口包含三个按钮和一个文本块,用于用户交互和显示结果。
  2. 按钮功能

    • “DOG” 按钮:点击后创建一个新的 Dog 对象,并将其添加到动物列表 Zoo 中。
    • “CAT” 按钮:点击后创建一个新的 Cat 对象,并将其添加到动物列表 Zoo 中。
    • “MAKESOUND” 按钮:点击后遍历 Zoo 列表,获取所有动物的名字、叫声和吃饭行为,并将这些信息显示在文本块中。
  3. 数据绑定

    • 使用 INotifyPropertyChanged 接口和数据绑定机制,实现数据的动态更新。具体来说,我的实验 类包含一个 显示串 属性,当其值发生变化时,通过数据绑定更新显示在界面上的文本块。

具体实现细节

  1. Animal 类及其派生类

    • Animal 类是一个基类,包含 NameAge 属性,以及虚方法 Makesound()吃饭()
    • Dog 类和 Cat 类继承自 Animal 类,分别重写了 Makesound()吃饭() 方法,提供各自特有的实现。
  2. MainWindow 类

    • 定义了主窗口的构造函数,初始化组件、动物列表 Zoo我的实验 类的实例。
    • 定义了三个按钮点击事件处理方法,分别用于添加 DogCat 对象,以及显示动物的名字、叫声和吃饭行为。
  3. 我的实验类

    • 实现 INotifyPropertyChanged 接口,包含一个 显示串 属性,当其值改变时,触发 PropertyChanged 事件通知界面更新。
  4. XAML 布局

    • 使用 XAML 定义主窗口布局,包括三个按钮和一个文本块。
    • 使用数据绑定机制,将 我的实验 类的 显示串 属性绑定到文本块的 Text 属性,实现动态数据展示。

项目功能总结

  • 添加动物:用户可以通过点击按钮向动物列表中添加 DogCat 对象,每个对象的名字包含当前秒数。
  • 显示动物信息:点击“MAKESOUND”按钮后,遍历动物列表,显示每个动物的名字、叫声和吃饭行为。
  • 数据绑定与动态更新:通过数据绑定机制和 INotifyPropertyChanged 接口,确保界面上的文本块能动态显示最新的动物信息。

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

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

相关文章

RabbitMQ的简单使用 —— Python篇

&#xff08;一&#xff09;RabbitMQ的简介 RabbitMq 是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式&#xff0c;应用程序通过写消息&#xff0c;将消息传递于队列&#xff0c;由另一应用程序读取 完…

JavaWeb项目配置教程

将你的项目&#xff08;只有代码的文件&#xff0c;不是整个文件&#xff09;拖入idea 找到数据库配置代码&#xff08;一般在Util包里面&#xff0c;或者是properties配置文件&#xff09;并将密码修改为你的数据库密码。 点击Edit Configurations 点击Configure&#xff0…

SOLIDWORKS安装运行环境建议 慧德敏学

SOLIDWORKS是一款要求很高的软件。无可否认。您的电脑功能越强大&#xff0c;运行得越好&#xff0c;但是我们也要考虑购买成本&#xff0c;因此&#xff0c;选择正确的配置很重要。在选择用于SOLIDWORKS的电脑配置时&#xff0c;需要综合考虑多个方面以确保软件能够流畅、以更…

Hi3861 OpenHarmony嵌入式应用入门--PWM 三色灯

这篇文章是讲解的pwm控制三色灯的部分&#xff0c;这部分也是后续全彩智能灯的基础。 硬件原理如下 IO管脚定义在hi-12f_v1.1.2-规格书-20211202.pdf文档中 GPIO API API名称 说明 unsigned int IoTGpioInit(unsigned int id); GPIO模块初始化 hi_u32 hi_io_set_func(hi_i…

无引擎游戏开发(2):最简游戏框架 | EasyX制作井字棋小游戏I

一、EasyX中的坐标系 不同于数理中的坐标系&#xff0c;EasyX中的y轴是竖直向下的 二、渲染缓冲区 之前的程序添加了这三个函数改善了绘图时闪烁的情况: 小球在"画布“上移动的过程就是我们在调用绘图函数&#xff0c;这个”画布“就是渲染缓冲区&#xff0c;先绘制的内…

【配置】Notion自动化备份到github方案

步骤 打开notion网页&#xff0c;获取到需要的值 token_v2 找到请求getSpaces的 Cookie 值 token_v2 space_id 找到请求getSpaces的响应结果space,如下图&#xff1a; file_token 找个页面点击导出&#xff0c;之后拿到这个配置项 注意&#xff1a;配置项会过期&#xff0c…

基于一种改进熵方法的旋转机械故障诊断模型(MATLAB)

熵的概念起源于热力学&#xff0c;1884年&#xff0c;玻尔兹曼定义熵&#xff0c;用以描述分子热运动的无序性和混乱度。1948年&#xff0c;Shannon在其发表的《AMathematicalTheoryofCommunication》中提出香农熵&#xff0c;首次将“熵”引入信息度量范畴&#xff0c;为信息论…

RK3568技术笔记十三 Ubuntu的编译

Ubuntu文件系统编译 在编译前需要按照前面的方法初始化编译环境&#xff0c;否则会导致编译失败&#xff08;若配置过则无需重复配置&#xff09;。 按下述方法编译的Ubuntu系统&#xff0c;用户名是&#xff1a;dianyu 密码&#xff1a;1 编译Ubuntu&#xff0c;执…

机械臂 CoppeliaSim Simulink联合仿真

实现机械臂在CoppeliaSim&#xff08;以前称为V-REP&#xff09;和Simulink上的联合仿真涉及多个步骤&#xff0c;包括环境设置、模型导入、通信配置、控制算法设计和测试调试。 前期准备 安装软件配置工作环境创建和配置CoppeliaSim场景 导入机械臂模型配置机械臂参数在Simuli…

webp图片格式怎么转换成jpg?值得收藏的四种转换方法介绍!

webp图片格式怎么转换成jpg&#xff1f;在当今数字图像处理领域&#xff0c;新兴的WebP格式以其独特的特性和兼容性&#xff0c;迅速成为备受追捧的图像格式之一&#xff0c;这一格式以其高效的压缩能力和优秀的网络传输速度著称&#xff0c;为网络图像的传输和存储提供了全新的…

一种稀疏贝叶斯学习的旋转机械故障诊断方法(MATLAB)

轴承的故障诊断技术是通过检测轴承故障特征信息来判断轴承的具体故障为位置或损伤程度。在轴承发生损坏时&#xff0c;故障特征信息会随着工作时间的增长变得明显。轴承的损坏过程可以分为四个阶段。第一个阶段为损伤初始阶段&#xff0c;轴承故障特征信号一般无法测量。第二个…

基于SSM+Jsp的书店仓库管理系统

摘要&#xff1a;仓库作为储存货物的核心功能之一&#xff0c;在整个仓储中具有非常重要的作用&#xff0c;是社会物质生产的必要条件。良好的仓库布局环境能够对货物进入下一个环节前的质量起保证作用&#xff0c;能够为货物进入市场作好准备&#xff0c;在设计中我们根据书店…

【人工智能】音乐大模型的深入探讨——当机器有了创意,是机遇还是灾难?

&#x1f440;国内外音乐大模型基本情况&#x1f440; ♥概述♥ ✈✈✈如FreeCompose、一术科技等&#xff0c;这些企业专注于开发人工智能驱动的语音、音效和音乐生成工具&#xff0c;致力于利用核心技术驱动文化产业升级。虽然具体公司未明确提及&#xff0c;但可以预见的是…

产业园区空间优化设计的创新实践者

树莓集团在产业园区运营中的空间优化设计方面&#xff0c;通过全面规划与科学布局、绿色智能与可持续发展、个性化定制与灵活多变、创新实践与数字化升级等措施&#xff0c;为企业提供了高品质、高效率的空间环境和服务支持。 一、全面规划与科学布局 明确产业定位&#xff1a…

Nuxt3 实战 (十一):添加路由 Transition 过渡效果和 Loading 动画

页面过渡效果 Nuxt3 利用 Vue 的 组件 在页面和布局之间应用过渡效果。 nuxt.config.ts 文件配置&#xff1a; export default defineNuxtConfig({app: {pageTransition: { name: page, mode: out-in }}, })在页面之间添加过渡效果&#xff0c;在 app.vue 文件中添加以下 CS…

USAD: 多元时间序列的无监督异常检测

USAD: 多元时间序列的无监督异常检测 原创 小王搬运工 时序课堂 2024-06-20 10:43 四川 论文地址&#xff1a;https://dl.acm.org/doi/abs/10.1145/3394486.3403392 论文源码&#xff1a;https://github.com/manigalati/usad 期刊&#xff1a;KDD 20: Proceedings of the 26…

嵌入式开发二十:定时器之基本定时器

定时器是微控制器中的关键外设&#xff0c;用于精确控制时间和事件。通过配置时钟源、预分频器、计数周期和比较值&#xff0c;可以实现各种时间控制任务&#xff0c;如定时中断、PWM生成和时间测量。理解定时器的工作原理和配置方法是嵌入式系统开发中的基本技能。 STM32F407 …

人工智能的头号威胁:投毒攻击

随着掌管数字生活入口的万亿美元俱乐部企业——苹果公司跳入人工智能&#xff08;AI&#xff09;赛道&#xff0c;AI技术民主化的大幕正式拉开&#xff0c;同时也将AI安全问题推向舆论的风口浪尖。 根据瑞银本周一的智能手机调查报告&#xff0c;在中国以外的智能手机用户中&am…

安装MySQL5.7版本步骤遇到问题

方法一&#xff1a;下载zip版本&#xff08;我用的这个&#xff09; 参考视频&#xff08;已收藏&#xff09;&#xff1a;windows安装MySQL5.7_哔哩哔哩_bilibili 下载zip压缩包的MySQL的网址&#xff1a;上面这个视频中有哦。 my.ini文件内容如下&#xff1a; [client] p…

有什么值得推荐的文件外发权限管理软件?

你的身边有这种事情发生吗&#xff1f; 一些工作人员在传达文件、部署工作时&#xff0c;为贪图方便&#xff0c;直接将涉密文件、涉密工作通过微信群传达部署&#xff0c;造成了大量泄密案件发生。 有些责任人员为了工作方便&#xff0c;对涉密文件进行拍照&#xff0c;通过…