news 2026/4/23 9:45:51

【第16天】16c#今日小结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【第16天】16c#今日小结

1.泛型类

1泛型方法:只需要在方法名字后面加<T,T1,T2> 为了确定参数类型和返回值类型,当然也可以参数和返回值类型定义成普通类型

2 泛型类:在类名后面添加<T>,目的把类型传入类当中

3 泛型接口:在接口后面添加泛型,目的把类型传接口当中

//泛型字母可以写任意的字母 class People<TTest1,TTest2> { public string Name { get; set; } public TTest1 A1 { get; set; }// 属性的类型和传入TTest1类型保持一致 public TTest2 A2 { get; set; } // 属性的类型和传入TTest2类型保持一致 public void F1<T>(T c ,TTest1 a,TTest2 b) { dynamic sum = (dynamic)c + (dynamic)a + (dynamic)b; Console.WriteLine(sum); } } //泛型接口 interface IPeople<T> { int Age { get; set; } T Name { get; set; } void F1<T1>(T a,T1 b); } class Student : IPeople<float> { public int Age { get; set; } public float Name { get; set; } public void F1<T1>(float a, T1 b) { Console.WriteLine(a + b.ToString()); } }
static void Main(string[] args) { People<int,float> p1 = new People<int,float>(); //传入的int 和float类型 p1.F1<float>(10.1f, 10, 20.2f); People<string,string> p2 = new People<string,string>(); p2.F1<string>("+++++++", "---------", "红客联盟白宫服务网站挂上中国国旗"); Student s1 = new Student(); s1.Age = 10; s1.Name = 19.1f; s1.F1<int>(10, 20); Console.ReadKey(); }

2.泛型约束

泛型约束: 泛型本身没有限制类型但是通过 where对泛型进行限制范围

本身泛型没有类型限制的

where T : struct限制T只能值类型

where T : class限制T只能是引用类型

where T : new() T必须有一个不带参数的构造函数的类

where T : IPeople T必须是实现接口的类型 或者实现接口类的派生类, 本例可以是Student、还可以继承于Student的子类:SmallStudent

where T : U限制传入类型 要么是T和U同一个类型、要么T是U的子类

eg:

//本身泛型没有类型限制的 static void Test1<T>(T a) { } // where T : struct 限制T只能值类型 static void Test2<T>(T a,T b) where T : struct { } //where T : class 限制T只能是引用类型 static void Test3<T>(T a, T b) where T : class { } //where T : new() T必须有一个不带参数的构造函数的类 static void Test4<T>(T a, T b) where T : new() { } //where T : IPeople T必须是实现接口的类型 或者实现接口类的派生类, 本例可以是Student、还可以继承于Student的子类:SmallStudent static void Test5<T>(T a, T b) where T : IPeople { } // where T : U 限制传入类型 要么是T和U同一个类型、要么T是U的子类 static void Test6<T,U>(T a, U b) where T : U { } } interface IPeople { } //接口 class Student:IPeople { } // Student实现接口 class SmallStudent:Student { } // SmallStudent继承了 Student //定义people类 class People { public People() { } // 无参数构造 public People(int a) { }// 有参数的构造 }
static void Main(string[] args) { //调用Test1方法 Test1<int>(10); Test1("hello"); Test1(DateTime.Now); //调用Test2方法 Test2(10, 10); //Test2<DateTime,int>(DateTime.Now, 10);报错 //Test2("11", 10);报错 //调用Test3方法 Test3("11", "11"); // Test4方法 Test4(new People(),new People()); // Test5方法 Test5(new Student(), new SmallStudent()); //Test6方法 Test6(new People(), new People()); Test6(new SmallStudent(), new Student()); // Test6( new Student(), new SmallStudent()); 报错 Console.ReadKey(); }

3.hash表

hash表:和字典很类似,存储时候也是键值对的方法进行存储的,通过键获取对应的值,和字典不同地方在于,hash表存储键值对类型不固定

Hashtable hashtable = new Hashtable(); 创建hash表

1.添加键值对
hashtable.Add(1, 2);
hashtable.Add("name", "张三");

2 .查询键对应的值
Console.WriteLine(hashtable[1]);//获取对应键的值

3.遍历hash所有的keys
foreach (var item in hashtable.Keys)
{
Console.WriteLine(item+"--------");
}

4.遍历hash所有的values
foreach (var item in hashtable.Values)
{
Console.WriteLine(item + "+++++++");
}

5. 遍历hash所有键值对
foreach (DictionaryEntry item in hashtable)
{
Console.WriteLine(item.Value+"?????????");
}
Console.ReadKey();

6 .清空键值对
hashtable.Clear();

7.指定键进行移除
hashtable.Remove(1);

8 .包含这个键
Console.WriteLine(hashtable.ContainsKey("name"));

9. 修改
hashtable["name"] = "你好";

10. 键值对个数
Console.WriteLine(hashtable.Count);

4.堆栈_stack_和队列

本节是按照线性数据结构据,数存储方式进行对比的

栈:对要操作元素会进行一个后进先出的操作,例如:现实场景电梯,先进去的人最后才出来,后进去的人先出来
添加元素称为入栈
取出一个元素操作称为出栈

Stack<string> stack = new Stack<string>();---存放字符串栈结构 stack.Push("张三");--- 入栈 stack.Push("李四"); stack.Push("王五"); string name = stack.Pop();---出栈 Console.WriteLine(name+"-----");---王五 Console.WriteLine(stack.Peek()); ---获取栈顶元素 李四 Console.WriteLine(stack.Count); ---2个 //stack.Clear(); ---清空栈 //stack.ToArray() ; ---转成数组

队列:对元素进行先进先出的操作 例如现实场景排队买饭
添加元素一般入队操作
取出元素一般出队操作

Queue<string> queue = new Queue<string>(); queue.Enqueue("马化腾"); ---入队 queue.Enqueue("马云"); queue.Enqueue("马嘉祺"); Console.WriteLine(queue.Count); Console.WriteLine(queue.Dequeue()); ---出队马化腾 Console.WriteLine(queue.Peek());---获取队顶元素马云 // queue.Clear(); 清空队列

按照存储区域分别解释堆和栈


特性 栈(Stack) 堆(Heap)
存储内容 值类型、方法参数、局部变量 引用类型对象、装箱的值类型
生命周期 随作用域结束自动释放 由垃圾回收器(GC)管理
分配速度 快(指针移动) 慢(动态查找可用内存)
内存布局 连续内存 非连续(可能产生碎片)
访问方式 直接 通过引用间接访问
线程关联 每个线程独有 所有线程共享
管理方式 编译器自动管理 垃圾回收器(GC)管理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 18:49:35

【医学图像算法手册前言】全景式速查:从经典方法到 SOTA 框架

【医学图像算法手册前言】全景式速查&#xff1a;从经典方法到 SOTA 框架 医学图像算法具有鲜明的领域特征&#xff1a;数据昂贵、噪声复杂、标注困难、临床约束强。这使得该领域长期呈现出一种“新方法不断涌现&#xff0c;但经典模型始终并存”的技术生态。 本专栏试图回答一…

作者头像 李华
网站建设 2026/4/7 10:25:28

Linux 桌面挑战 Windows 真正需要的是什么

作为一个从大界面问题还是选择 Korn 还是 Bash shell 时就开始使用 Linux 桌面的老用户&#xff0c;我见证了这个领域的发展历程。在那之前&#xff0c;我使用过各种 Unix 桌面&#xff0c;比如 Visix Looking Glass、Sun OpenWindows 和 SCO 臭名昭著的 Open Deathtrap Deskto…

作者头像 李华
网站建设 2026/4/15 8:50:41

北京电子科技学院破解AI安全防线:当“温水煮青蛙“遇上大语言模型

当你第一次直接问AI如何制造危险武器时,它会断然拒绝。但如果你先聊聊古代火药的历史,再谈谈现代爆炸物的化学原理,然后逐步引导话题,最终AI可能会告诉你那些它本应保密的信息。这不是科幻情节,而是北京电子科技学院研究团队刚刚揭示的一个真实现象。2025年12月,来自北京电子科…

作者头像 李华
网站建设 2026/4/20 7:01:06

Vivado下载速率优化技巧(适用于Artix-7)

让 Artix-7 的 Vivado 下载快到飞起&#xff1a;实战优化全指南你有没有过这样的经历&#xff1f;改完一行代码&#xff0c;综合布线跑完一个多小时&#xff0c;终于等到烧录验证了——结果点下“Program Device”&#xff0c;Vivado 却慢悠悠地开始下载&#xff0c;十几秒甚至…

作者头像 李华
网站建设 2026/4/15 22:34:19

基于单片机的超声波自动泥浆回收系统

基于单片机的超声波自动泥浆回收系统 点击链接下载protues仿真设计资料&#xff1a;https://download.csdn.net/download/m0_51061483/92081515 1 系统总体设计概述 1.1 设计背景与工程意义 在建筑施工、市政工程、矿山开采以及污水处理等领域&#xff0c;沉淀池中往往会产生…

作者头像 李华
网站建设 2026/4/21 6:32:50

DAY26@浙大疏锦行

1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5. 传递参数的顺序&#xff1a;同时出现三种参数类型时

作者头像 李华