• .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
  • 相关阅读:
    续集来了!我让 GPT-4 用 Laf 三分钟写了个完整的待办事项 App
    vue 子组件向父组件传递参数 子传父
    Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别
    PHP火狼大灌篮游戏源码微信+手机wap源码带控制
    vscode 打代码光标特效
    第7集丨我找不着北:心学与理学的PK
    小白必看!上位机控制单片机原理
    多线程拷贝文件
    【计算机视觉】图像形成与颜色
    Java面试八股文 2021年最新Java面试题及答案汇总
  • 原文地址:https://blog.csdn.net/weixin_42710036/article/details/127873306