什么是类型
●为什么要买内存大的计算机?程序运行,必须要硬盘加载到内存中才能运行。(内存:计算机运行的空间)
●硬盘是如何存储的?
●C#强类型语言,受数据类型约束强。
● dynamic类型:C#对弱类型的模仿
类型在C#语言中的作用
●程序所处状态:
静态时期:编辑器和编译期
写代码的时候,拿编译器编译的时候都没有运行起来
动态时期:运行期
一旦执行起来,调试Dubug
举例说明:
using System;
using System.Windows.Forms;
using System.Reflection;//反射相关
namespace TypeSampleS
{
class Program
{
static void Main(string[] args)
{
Type myType = typeof(Form);
//PropertyInfo需要using System.Reflection;
PropertyInfo[] pInfos = myType.GetProperties();
MethodInfo[] mInfos = myType.GetMethods();
//可在程序动态的时候找到属性、方法、事件等...
Console.WriteLine(myType);
Console.WriteLine(myType.FullName);
Console.WriteLine(myType.BaseType.FullName);
foreach (var p in pInfos) //打印出属性
{
Console.WriteLine(p.Name);
}
foreach (var m in mInfos) //打印出方法
{
Console.WriteLine(m.Name);
}
}
}
}
●内存相关
●运行程序:静态 > 动态 的切换。实际上就是从硬盘装载到内存里。
●程序在内存中,怎么利用内存?分为两个区域:Stack(栈)、Heap(堆)。
○栈作用:方法(函数)调用 很小(一般几兆);
小且快(爆掉的情况:①算法没写好,函数调用太多;②栈上分配太多的内存->栈溢出)
○堆作用:存储对象 很大(一般几个G)
(内存泄漏:分配对象但没回收对象,造成内存浪费,学名“内存泄漏”)
对比C++与C#在内存泄漏上的区别:(C#比C++安全很多)
①C++忘记回收内存,是真的内存泄漏了。
②C#有“垃圾收集器”的机制,不用手动释放内存,当它发现一旦没人使用内存,自动收回。
○栈和堆在实例上的应用:
← 栈 直接切走(爆掉)案例
namespace TypeSampleS
{
class Program
{
static void Main(string[] args)
{
BadGuy bg = new BadGuy();
bg.BadMethod();
}
}
class BadGuy
{
//会很快爆掉:每调一次,都需要在栈上切出一块内存来存储x变量
public void BadMethod()
{
int x = 100;
this.BadMethod();//递归调用自己
}
}
}
○堆内存泄露案例及分析
(←案例 分析↓)
分析操作:主界面Win+R,输入perfmon 进入 性能监视器;点击“+”,找到Process,在其下方找到Private Bytes,Add(添加),点击确定即可开始观察分析。
问题:红线始终在顶上?超出可表示的容量
●进程(Process):用硬盘加载到内存之后,形成进程。(程序运行的实例)
●实例永远分配在堆里。