它是一种把相关的档次评释分组并取名的措施,那么大家就先看看那些小程序

  
既然是一个小程序引发的探究,那么大家就先看看这一个小程序,看看她有什么神奇之处:

C#次第或DLL的源码是一组项目标扬言

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass s = new MyClass();
            s.val = 10;
            int i = 20;
            Console.WriteLine("s.val={0},i={1}",s.val,i);
            MyMethod(s, i);
            Console.WriteLine("s.val={0},i={1}", s.val, i);
            Console.Read();
        }
        static void MyMethod(MyClass f1,int f2)
        {
            f1.val = f1.val + 5;
            f2 = f2 + 5;
        }
    }
    class MyClass
    {
        public int val = 20;
    }
}

类:类型是一种模板,可以把品种想象成一个用来创建数据结构的模板。模板本身并不是数据结构,但它详细表明了该模板构造的靶子的特性。

呵呵,我们看了未来可能会觉得那不是很粗略的代码吗?有何特其他地点吧?没有,真没有!可是我想问下我们那两回输出结果会有怎么着不相同吧?分别是怎么?有没有得出五遍结果都是同一的?这几个程序输出的结果是:

取名空间:它是一种把相关的档次申明分组并取名的方式。既然程序是一组有关的序列申明,那么普通会把程序注脚在开创的命名空间内。

图片 1

对于可执行程序,类型注脚中务必有一个富含Main方法。

   
可能有点童鞋可能会问,不应有是均等的啊?为什么一个值变了,其它一个尚无变呢?那是干什么吧?仔细的校友可能会发觉static
void MyMethod(MyClass f1,int
f2)这么些主意五个参数的种类分化等,f1属于引用类型,f2属于类型,是否因为这么些原因才招致多个变量经过同样的处理,s.val的值改变了,i的值却不曾变。首先大家精通下怎样是值类型,什么是引用类型。

下边是.Net中预约义的品类:

值类型与引用类型(这么些面试的时候平常会被问到)

   
值类型:值类型只须求一段单独的内存,用于存储实际的数量,他存在栈里面

   
引用类型:引用类型需要两段内存。

  • 第一段储存实际的数据,它总是位于堆中。
  • 其次段是一个引用指向数据在堆中的地点,它日常位于栈中。

那那样说,像上边s对象,它是一个引用类型,那它应该存放在堆中,可是val又是个值类型,这它不是应当存放在栈中吗?

   
请牢记,对于一个引用类型,其实例部分始终存放在堆里。既然val是对象s的一有的,那么它们都会被存放在在堆里,无论它们是值类型仍然引用类型。

图片 2

那边顺便介绍下栈和堆

   
栈:栈是一个内存数组,是一个LIFO(last-in first-
out,后进先出)的数据结构,栈存储二种档次的数额。

  • 某些类型变量的值
  • 程序当前的进行环境
  • 传送给艺术的参数
栈有以下几个特征:
  • 数据只好从栈的上边插入和删除。                                                                       

  • 把多少放到栈顶叫入栈(push)。

  • 从栈顶删除数据叫出栈(pop)

    堆:堆是一块内存区域,在堆里可以分配大块的内存用于存储某些的项目标靶子。与栈不一致,堆里的内存可以随意顺序存入或移除。

      
    纵然可以在堆里保存数据,但并不能显式地删除它们。CLR的自发性GC在认清出程序的代码不会再拜访一些数据时,自动清除无主的堆对象。大家为此可以毫不操心那项使用任何编程语言时卓殊简单出错的工作了。

         
    在介绍了值类型、引用类型与堆和栈,那我们解析下方面程序的实践步骤:

    • 在章程被调从前,用作实参的变量s已经在栈里了。

    • 随着方法的始发,系统在栈中为形参分配空间,并从实参复制值。

    • 因为s是援引类型所以引用被复制,结果实参和形参都引用堆中的同一个目标。

    • 因为i是值类型,所以值被复制,暴发了一个单身的数量项。

    • 在点子的结尾,f2和目标f1的字段都被添加5.

    • 办法执行后,形参被从栈中弹出。

    • i,值类型,它的值不受方法行为的熏陶。

    • s,引用类型,它的值被艺术的作为改变了。

亲爱的童鞋们,你们明白了吗?别看一点小程序,原来深挖可以得出那么多信息。其实也侧面说明了基础的重要性,童鞋们加油吧!

图片 3

堆和栈

对于.Net平台来说内存中使用堆栈的定义来存放数据。
栈是一个内存数组,是一个LIFO(last-in First-out 后进先出)的数据结构。
栈中蕴藏的数据类型:值类型数据,引用类型的地址,
程序当前的进行环境,传递给艺术的参数。
栈的特色:数据只好从栈的上边插入和删除,把数量放到栈顶称为入栈(Push),从栈顶删除数据称为出栈(POP),由此得以把栈想像成一个水杯。

栈桢

当一个措施被调用时,在栈顶分配了一块内存用于保存一定数量与方法有关的多寡项,这块内存叫方法的栈桢。
栈桢中存放的数码有:重临地址(就是艺术退出时在哪个地方继续执行)、分配内存的参数(就是艺术的值参数)、方法调用相关的其余各类管理数据项。
当方法被调用时,它的任何栈桢被压入栈中,方法退出时,它的万事栈桢从栈中弹出。弹出一个栈桢有时也号称释放栈。

与栈不一致,堆是一块内存区域,在堆里可以分配大块的内存用于存储某项目标数码,堆里的内存可以任意顺序存入和移除。但不可能的去除它们。
CLR的机动GC(Garbage
Collector,垃圾收集器)在认清出程序的代码将不会再拜访某数码项时(该引用类型没有其他引用时),自动清除无主的堆对象。

堆中貌似存放的是援引类型的莫过于数据而栈存放的是值类型。

值类型:只要求一段单独的内存,用于存储实际的多少。(因栈是一个内存数据,存放一些占有空间相比小的数据)

引用类型:它须求两段内存,1囤积实际的数额,它连接位于堆中,2是一个引用,指向数据在堆中的存放地方。

图片 4

对此一个引用类型,其实例的数目部分始终存放在堆里。
对此一个值类型对象,或引用类型数据的引用部分可以存放在堆里,也得以存放在栈里,那依赖于实际条件。
图片 5

类:以程序的角度来说程序的多少和功力团体为逻辑上相关的多寡项和函数的包装集合,称之为类。
类:以实际的角度来说对一些事物共同性的架空的叙说。
类是一个能积存数据并履行代码的数据结构,类的种种实例都是不一样的实业。

变量:当申明定义变量,其里面形成了两件事:1.给变量命名,并为它事关一种档次。2让编译器为它分配一块内存。
常量:(Const)平时是一个预订义不难类型或期组成的表明式。它还足以是Null引用,但它不可以是某目的的引用,因为对象的引用是在运作时控制的。常量中是无法重复赋值的。

参数:
形参:是声称在措施的参数列表中而不是方法体中的本地变量。
实参:当代码调用一个方法时,形参的值必须在措施的代码开始举办在此以前初,起始化。
值参数:(传值)数据通过复制实参的值到形参的格局传送到格局。
引用参数:(传地址)使用Ref修饰符,实参必须是变量,在用作实参前必须被赋值。
输出参数:
使用out修饰符,用于方法体内把多少传出到调用代码,它们非凡类似引用参数。每个输出参数在章程读取、再次回到此前必须被赋值,那就意味着参数的开端值是前言不搭后语的。
参数数组:允许零个或七个实参对应一个特其他形参,在一个参数列表中不得不有一个参数数组,并且它必须是列表中最终一个。使用(Params)修饰符。

即使数组参数是值类型,那么值被复制,实参不受方法内部的震慑。

一旦数组参数是援引类型,那么引用被复制,实参引用的对象受到方法内部的影响。