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)
{
  // ...
}

不需要参数校验了~

posted @   .Neterr  阅读(708)  评论(0编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示