c#之泛型,partial类,枚举,结构体
1.泛型
优点:避免成员膨胀或者类型膨胀
看下面的代码:
namespace TestClass { class Program { static void Main(string[] args) { Console.ReadKey(); } } public class Apple { public string Corlor { get; set; } } public class AppleBox { public Apple apple { get; set; } } public class Book { public string Name { get; set; } } public class BookBox { public Book book { get; set; } } }
从上面的代码可以看出,如果以后要是水果种类一多,就会造成类型膨胀。所以我们想可以只用一个盒子类,把所有的水果等放到这一个盒子类中包装,
比如下面:
public class Box { public Book book { get; set; } public Apple apple { get; set; }
..... }
但是这样又会造成成员膨胀。
所以我们可以通过泛型来实现。
namespace TestClass { class Program { static void Main(string[] args) { Apple apple = new Apple() { Color="蓝"}; //泛型的特化 Box<Apple> boxApple = new Box<Apple>(){ box =apple}; Console.WriteLine(boxApple.box.Color); Console.ReadKey(); } } public class Apple { public string Color { get; set; } } public class Book { public string Name { get; set; } } /// <summary> /// 泛型类 /// </summary> /// <typeparam name="T"></typeparam> public class Box<T> { public T box { get; set; } } }
(2)接口泛型
class Program { static void Main(string[] args) { //泛型的特化 Student<ulong> student = new Student<ulong>() { ID = 123231231 }; Console.WriteLine(student.ID); Console.ReadKey(); } } interface IUmique<T> { T ID { get; set; } } class Student<T> : IUmique<T> { public T ID { get; set; } }
有时候派生类继承的时候就确认类要用哪个类型:
class Program { static void Main(string[] args) { Student student = new Student() { ID = 123231231, Name="cehsi" }; Console.WriteLine(student.ID); Console.ReadKey(); } } interface IUmique<T> { T ID { get; set; } } class Student: IUmique<ulong> { public ulong ID { get; set; } public string Name { get; set; } }
2.partial类
优点:减少类的派生
Partial是局部类型的标志。局部类型可以实现将一个类、结构或接口分成几个部分,分别放在在几个不同的.cs文件中(当然也可以放在同一个.cs文件中)。在程序进行编译之后,将会合并成一个完整的类。
public partial class Test { public int Id { get; set; } } public partial class Test { public void TestMethod() { } }
编译之后:
public partial class Test { public int Id { get; set; } public void TestMethod() { } }
3.枚举类型
枚举是用户定义的整数类型, 是一组命名整型常量。它是强类型的,与类同级,通常用来表示一组常量
可指定类型有:byte、sbyte、short、ushort、int、uint、long、ulong
除了正常的枚举用法之外,还有位枚举
class Program { static void Main(string[] args) { //按位OR运算符,二进制中只要有一位是1,结果就是1. var skills = Skill.Cook | Skill.Drive | Skill.Program | Skill.Ride | Skill.Teach; Console.WriteLine(skills);//31 //是否会做饭 Console.WriteLine((skills&Skill.Cook)>0); //是否会飞 Console.WriteLine((skills & Skill.Fly) > 0); Console.ReadKey(); } } enum Skill { Drive=1, Cook=2, Program=4, Teach=8, Ride=16, Fly = 32, }
结果:
31
True
False
4.结构体
结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。
class Program { static void Main(string[] args) { Student student = new Student() { ID = 1, Name = "test1" }; Student student2 = student;// new Student() { ID = 1, Name = "student2" }; student2 = new Student() { ID = 1, Name = "student2" }; Console.WriteLine(student2.ID + " :" + student2.Name); Console.WriteLine(student.ID + " :" + student.Name); Console.ReadKey(); } } struct Student { public int ID { get; set; } public string Name { get; set; } }
结果:
1 :student2
1 :test1
因为结构体是值类型的,赋值的时候存储的是值信息,不是地址。
注意:结构体类型只能继承自接口。不能有显式的无参构造器。
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术