C# 记12泛型

本文详细介绍了C#中的泛型,包括泛型的含义、使用场景,特别是可空类型的运用,如??和?.运算符。同时,深入探讨了System.Collections.Generic中的List<T>、Dictionary<Key,Value>等泛型集合,并讲解了如何进行排序和搜索操作。" 121395222,10829884,Java实现图片与Base64字符串互转,"['Java开发', '图片处理', 'Base64编码']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CH12.1 - CH12.2

标签(空格分隔): 泛型 generic



1. 泛型的含义

借助泛型,可以根据要处理的精确数据类型定制方法、类、结构或接口。
泛型的优点包括:代码的可重用性增加,类型安全性提高。

2. 使用泛型

2.1 可空类型nullable type

解决值类型的一个小问题 int double
值类型不能为空,而引用类型可以为空
System.Nullable<T> nullableT;
nullableT不但可以是类型T的任意值,还可以为空。
另外可以使用HasValue属性

2.1.1 运算符和可空类型
int? nullableInt;
nullableInt = null;//正确
2.1.2 ??运算符(空接合运算符)

op1 ?? op2
op1 == null ? op2 : op1//三元运算
解释: 第一个不是null该运算等于第一个操作数,反之,等于第二个操作数。

2.1.3 ?.运算符(空条件运算符)

有助于避免繁杂的空值检查。

int? count = customer.orders?.Count();
    //if orders is null, count = null; else count = orders.Count();
int? count = customer.orders?.Count() ?? 0;
    //if orders is null, count is assigned to 0; else count = orders.Count();

触发事件
触发事件最常用方法

var onChanged = OnChanged;
if (onChanged != null)
{
    onChanged(this, args);
}

这种模式不是线程安全的,改进使用空条件运算符避免异常
onChanged?.Invoke(this, args);
注意: 使用运算符重载方法,但是没有检查null,就会抛出 System.NullReferenceException

首先说下,invoke和begininvoke的使用有两种情况:
1. control中的invoke、begininvoke。
2. delegrate中的invoke、begininvoke。
这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官方定义。
control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。
control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。
根据这两个概念我们大致理解invoke表是同步、begininvoke表示异步。

2.2 System.Collections.Generic

此名称空间包含用于处理集合类的泛型类型。
表 泛型集合类型

类型说明
List<T>T类型对象的集合
Dictionary<K,V>与k类型的键值相关的V类型
2.2.1 List< T>
List<Animal> animalCollection = new List<Ch12Ex02.Animal>();
animalCollection.Add(new Cow("Rual"));
animalCollection.Add(new Chicken("Dona"));
foreach(Animal myAnimal in animalCollection)
{
     myAnimal.Feed();
}
2.2.2 对泛型进行排序和搜索

泛型接口IComparer<T>IComparable<T>
排序和搜索两个委托
Comparison:用于排序方法
Predicate:用于搜索方法
使用方法见CH12Ex03

2.2.3 Dictionary< Key,Value>
 Dictionary<string, Int32> dictionary = new Dictionary<string, int>();
 dictionary.Add("Green", 26);
 dictionary.Add("Red", 36);
 dictionary.Add("Blue", 12);
 foreach(string key in dictionary.Keys)
 {
  Console.WriteLine(key);
 }
 foreach(int value in dictionary .Values)
 {
  Console.WriteLine(value);
 }
 foreach(KeyValuePair<string,int> thing in dictionary)
 {
  Console.WriteLine(thing.Key + " " + thing.Value);
 }

键值必须唯一。
键值不唯一抛出异常ArgumenException异常。
允许把ICompare接口传递给其构造函数。
Dictionary<string, int> dictionary = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);

英文单词

WordInterpretation
Invoke援引
Thetaθ
radians弧度
vector矢量
Format格式
Library图书馆
victory胜利
complete完成
python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值