• .net 杂谈之二



    一、Type类

    表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。

    using System;
    using System.Reflection;
    
    class Example
    {
        static void Main()
        {
            // 获取到String的类型
            Type t = typeof(String);
    
            // 通过String的Type获取到其中的元数据,下例是方法Substring,两个参数
            MethodInfo substr = t.GetMethod("Substring",
                new Type[] { typeof(int), typeof(int) });
    
            // Invoke执行方法
            Object result =
                substr.Invoke("Hello, World!", new Object[] { 7, 5 });
            Console.WriteLine("{0} returned \"{1}\".", substr, result);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    Type是System.Reflection的根,是访问元数据的主要方式。使用Type的成员可以获取有关类型声明、类型成员(例如类的构造函数、方法、字段、属性和事件)以及部署该类的模块和程序集的信息。

    二、Class、struct、record

    2.1 引用类型与值类型

    引用类型,只会存一个对象的引用

    引用类型有 class interface record delegate

    值类型

    int double float struct 元组(int, int)

    2.2 class struct record的区别

    class 没有重载运算符==的情况下虽然可以被比较,但不是比较其中每个属性的值,比较的是是否指向同一块内存

    struct 没有重载运算==的情况下,是不可被比较的

    record 可以被比较并且它比较的是所有的属性

    三、泛型

    泛型将类型参数的概念引用.NET,这样就可以设计具有以下特征的类和方法:

    • 在客户端代码声明并初始化这些类或方法之前,这些类或方法会延迟指定一个或多个类型
    • 通过使用泛型类型参数T,可以编写其他客户端代码能够使用的单个类,而不会产生运行时转换或装箱操作的成本或风险。

    3.1 泛型约束

    • struct
    • class
    • new()
    • notnull
    • baseclass
    • interface
    • U(另一个泛型)
    • Default
    • unmanaged

    四、元组类型与弃元

    从c# 7.0开始启用元组功能,它提供了简洁的语法,用于将多个数据元素分组成一个轻型数据结构。
    元组类型是值类型
    如:(double, int) t1 = (4.5, 3)
    (double t1, double t2) = (1, 2)
    (double t1, double t2) a = (1, 2)
    (double t1, double t2) v = (1, 2)
    a==v true
    元组可以做比较,比较个数及其成员逐个比较。

    4.1 弃元

    弃元相当于未赋值的变量;
    (_, int b) = func();

    
    (int, int) a = (1, 2);
    Console.WriteLine(a.Item1);
    Console.WriteLine(a.Item2);
    
    (int b, int c) = a;
    Console.WriteLine($"{b}, {c}");
    
    (int, double) Func()
    {
        return (1, 1.2);
    }
    
    (int d, double e) = Func();
    Console.WriteLine($"{d}, {e}");
    
    //轻䡆交换两个数
    int f = 1;
    int g = 2;
    (f, g) = (g, f);
    Console.WriteLine($"{f}, {g}");
    
    Action<int, double> actionA = null;
    // 弃元的用法,我这里用不到int这个参数
    actionA += (_, d) =>
    {
        Console.WriteLine(d + 3);
    };
    
    actionA(2, 1.2);
    
    // 弃元在switch表达式中的使用
    int switchA = 5 switch
    {
        1 => 2,
        // 表示default,没有匹配到就走这里
        _ => 5,
    };
    
    Console.WriteLine($"{switchA}");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    Verilog的时间系统任务----$time、$stime、$realtime
    LeetCode ❀ 66. 加一 / python
    《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)
    list转map(根据某个或多个属性分组)
    python实战故障诊断之CWRU数据集(五):线性判别模型及二次判别模型的应用
    Shiro学习详解
    【动态规划】leetcode 62. 不同路径
    聊聊Transform模型
    Android超级好看的动态登陆界面(附有详细代码)
    制作一个简单HTML电影网页设计(HTML+CSS)
  • 原文地址:https://blog.csdn.net/weixin_42710036/article/details/127873306