类型、变量与对象详解(上)
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(); } }
结果:

通过反射简化依赖注入:
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(); } }
结果相同:

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