C#中的Explicit和Implicit
implicit和explicit是一对转换操作符
Implicit关键字:用于声明隐式的用户定义类型转换运算符。它可以实现2个不同类的隐式转换 ,提高代码的可读性。
Explicit关键字:声明必须通过转换来调用的用户定义的类型转换运算符。不同于隐式转换。
1 public class People<T>
2 {
3 public string Name { get; set; }
4 public int Age { get; set; }
5 public T Data { get; set; }
6
7 public People(string name = "zhangsan", int age = 15)
8 {
9 this.Name = name;
10 this.Age = age;
11 }
12
13 public People()
14 {
15
16 }
17
18 public static implicit operator People<T>(int age)
19 {
20 return new People<T>(age: age);
21 }
22 public static implicit operator People<T>(string name)
23 {
24 return new People<T>(name: name);
25 }
26 public static implicit operator String(People<T> p)
27 {
28 return p.Name;
29 }
30 public static implicit operator int(People<T> p)
31 {
32 return p.Age;
33 }
34 public static explicit operator T(People<T> p)
35 {
36 return p.Data;
37 }
38 public static implicit operator People<T>(T t)
39 {
40 return new People<T>() { Data = t };
41 }
42
43 }
使用:
1 static void Main(string[] args)
2 {
3
4 People<DateTime> p = new People<DateTime>(name: "zhangsan", age: 15);
5 int age = p;
6 string name = p;
7 People<DateTime> p2 = 16;
8 People<DateTime> p3 = "lisi";
9 People<DateTime> p4 = DateTime.Now;
10 object data = (DateTime)p4;
11
12 Console.ReadKey();
13 }
案例
非空校验
方法的参数非空校验,导致校验很多、非常繁琐,以下代码是个思路
public class NotNull<T>
{
public NotNull(T value)
{
this.Value = value;
}
public T Value { get; set; }
public static implicit operator NotNull<T>(T value)
{
if (value == null)
throw new ArgumentNullException();
return new NotNull<T>(value);
}
}
public void DoSomething(NotNull<string> message, NotNull<int> id, NotNull<Product> product)
{
// ...
}
不需要参数校验了~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构