.net 杂谈之二

文章目录

  • 一、Type类
  • 二、Class、struct、record
    • 2.1 引用类型与值类型
    • 2.2 class struct record的区别
  • 三、泛型
    • 3.1 泛型约束
  • 四、元组类型与弃元
    • 4.1 弃元


一、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);
    }
}

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}");

你可能感兴趣的:(.net及生态,.net,开发语言)