类型、变量与对象详解(上)

1.什么是类型

Type又名数据类型(Data Type)

  • 是数据在内存重存储时的”型号“
  • 小内存容纳尺寸数据会丢失精度、发生错误
  • 大内存容纳小尺寸数据会导致浪费
  • 编程语言的数据类型与数据的数据类型不完全相同

强类型与弱类型语言的比较

强类型:编写程序时,程序中的数据受到的数据类型的约束,即强类型编程语言

弱类型:数据类型约束不严格,或基本不受约束,即弱类型编程语言(如JavaScript动态语言)

C#从4.0开始引入了Dynamic,让它可以利用动态语言的一些特性,但C#依然时强类型编程语言

2.类型在C#语言中的作用

一个C#类型中所包含的信息有:

  • 存储此类型变量所需的内存空间大小
  • 此类型的值可表示的最大、最小值范围
  • 此类型所包含的成员(如方法、属性、事件等)
  • 此类型由何基类派生而来
  • 程序运行的时候,此类型的变量被分配在内存的什么位置
    • Stack 
    • Heap
  • 此类型所允许的操作(运算)

对一个程序来说,静态指编辑期、编译期,动态指运行期。

静态时装在硬盘里,动态时装在内存里。

3.反射示例

通过反射简化依赖注入,使用的ioc容器NuGet包是微软官方库Microsort.Extensions.DependencyInjection,IDE是LinqPad

传统方法:

void Main()
{
    var services = new ServiceCollection();
    services.AddTransient<ServiceA>();
    services.AddTransient<ServiceB>();
    
    var provider = services.BuildServiceProvider();
    
    var serviceA = provider.GetRequiredService<ServiceA>();
    serviceA.Executed();
    var serviceB = provider.GetRequiredService<ServiceB>();
    serviceB.Executed();
    
}

public interface IService
{
    void Executed();
}

public class ServiceA : IService
{
    public void Executed()
    {
        "ServiceA executed".Dump();
    }
}

public class ServiceB : IService
{
    public void Executed()
    {
        "ServiceB executed".Dump();
    }
}

结果:

image

 通过反射简化依赖注入:

void Main()
{
    var services = new ServiceCollection();
    var executeAssembly = Assembly.GetExecutingAssembly();
    
    var serviceType = typeof(IService);
    var types = executeAssembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && serviceType.IsAssignableFrom(t));
    foreach (var t in types)
    {
        services.AddTransient(t);
    }
    
    var provider = services.BuildServiceProvider();
    
    var serviceA = provider.GetRequiredService<ServiceA>();
    serviceA.Executed();
    var serviceB = provider.GetRequiredService<ServiceB>();
    serviceB.Executed();
    
}

public interface IService
{
    void Executed();
}

public class ServiceA : IService
{
    public void Executed()
    {
        "ServiceA executed".Dump();
    }
}

public class ServiceB : IService
{
    public void Executed()
    {
        "ServiceB executed".Dump();
    }
}

结果相同:

image

 在这个例子中,传统方法注入时,注册时即使相同接口不同的实现也要注册,多少个实现注册多少次;使用反射时,相同接口不同实现会自动注册,程序员只需要注重实现和使用。

 

 

 

  

posted @ 2025-08-04 00:44  没有伞的孩子_97  阅读(8)  评论(0)    收藏  举报