值类型与援类型(上)

  • 引用类型嵌套值类型
using System;
using System.Configuration;

namespace Common
{
    public static class ConfigurationHelper
    {
        public static string AppSetting(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }
    }
}

俺们掌握,每个变量或者程序还发那个堆栈,不同的变量不能够共有同一个库地址,因此myStruct和myStruct2当库中必将占用了不同的库房地址,尽管通过了变量的传递,实际的内存还是分配在不同之地点及,如果我们重对myStruct2变量改变时,显然不会见潜移默化及myStruct的数额。从图被我们还足以显著的张,myStruct在库中带有其实例数据,而myClass在库房中只是保存了事实上例数的援地址,实际的数保存于托管堆着。因此,就闹或不同之变量保存了平等地址之数额援引,当数从一个援类型变量传递到任何一个平类别的援类型变量时,传递的凡彼引用地址而无是实际的数,因此一个变量的转会影响外一个变量的价值。从者的分析就是足以清楚的掌握这么一个粗略的理:值类型和援类型在内存中的分红区别是控制其采取不同之根本原因,由此我们即便可以充分易之说为何参数传递时,按值传递不见面转移形参值,而按址传递会改变行参的值,道理正在于这个。 

4、同样,我们再次来创造一个左右文工厂,即便以后来差不多个数据库上下文,也能够好好之支撑。

  • 值类型变量做吧局部变量时,该实例将吃创造于仓房上;而只要值类型变量作为项目的积极分子变量时,它以作为项目实例数据的均等有些,同该品种的旁字段都保存于托管堆上,这点我们以在连接下去的嵌套结构局部来详细说明。

  • 引用类型变量数据保存于托管堆上,但是依据实例的深浅有所区别,如下:如果实例的大小小于85000Byte不时,则该实例将开创于GC堆上;而当实例大小大于等于85000byte时,则该实例创建以LOH(Large
    Object Heap)堆上。

业务层调用数据层对象,我不思量每次都new一个数据层对象,而是于数据层创建一个储存,统一管理所有的对象调用。

请问:如果AType是值类型,则分配了不怎么内存;而而AType是援类型时,又分配了稍稍内存?

using System.Data.Entity;
using System.Runtime.Remoting.Messaging;
using Model;

namespace DAL
{
    public class DBContextFactory : IDBContextFactory
    {
        #region 创建 EF上下文 对象,在线程中共享 一个 上下文对象 + DbContext GetDbContext()
        /// <summary>
        /// 创建 EF上下文 对象,在线程中共享 一个 上下文对象
        /// </summary>
        /// <returns></returns>
        public DbContext GetDbContext()
        {
            ////从当前线程中 获取 EF上下文对象
            var dbContext = CallContext.GetData(typeof(DBContextFactory).Name) as DbContext;
            if (dbContext == null)
            {
                dbContext = new OAEntities();
                CallContext.SetData(typeof(DBContextFactory).Name, dbContext);
            }
            return dbContext;
        }
        #endregion
    }
}

我们的辨析如下:根据CRL的内存机制,我们清楚要ATpye为Int32色,则象征其元素是值类型,而数组本身吗援类型,myType将保留指向托管堆中的一律块大小也4×10byte底内存地址,并且以有的因素赋值为0;而若AType为自定义的援类型,则会单纯做一样糟糕外存分配,在线程的仓库创建了一个对准托管堆的援,而具备的元素被设置也null值,表示也空。

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#><#@ output extension=".cs"#> 
<#
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this, 1);
MetadataTools ef = new MetadataTools(this);
string inputFile = @"..\MODEL\OA.edmx";
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
string namespaceName = code.VsNamespaceSuggestion();
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IDAL
{
public partial interface IDBSession
{
<#
    // Emit Entity Types
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
#>
   I<#=entity.Name#>DAL I<#=entity.Name#>DAL{get;set;}
<#}#>
}
}

图片 1  

namespace IDAL
{
    /// <summary>
    /// 数据仓储工厂
    /// </summary>
   public interface IDBSessionFactory
    {
       IDBSession GetDBSession();
    }
}

2.2 内存深入

新建DBSession.tt模板

2.1 基本概念

using System.Data.Entity;

namespace IDAL
{
    /// <summary>
    /// EF数据上下文 工厂
    /// </summary>
   public interface IDBContextFactory
    {
       /// <summary>
        /// 获取 EF 上下文对象
       /// </summary>
       /// <returns></returns>
       DbContext GetDbContext();
    }
  •  值类型嵌套引用类型

图片 2图片 3

——–引用地址:http://blog.csdn.net/NETZHOU/archive/2007/06/27/1668621.aspx

接下,我们创建DBSession工厂和内外文工厂,目的是为提高效率,在线程中共用一个靶。

数据在内存中的分红职务,取决于该变量的数据类型。由臻可知,值类型通常分配在线程的库上,而引用类型一般分配在托管堆上,由GC来控制该回收。例如,现在来MyStruct和MyClass分别表示一个结构体和一个好像,如下:

1、在IDAL项目中,新建IDBSession.tt模板

图片 4 

View Code

2.2.3. 一个简短的座谈

Ctrl+S后自动生成IDBSession接口

  • 项目的基本概念 
  • 值类型深入
  • 引用类型深入
  • 值类型与援类型的较和运用

IDAL项目中,新建IDBContextFactory.cs接口

彼内存分配图可以代表为:

3、IDAL项目蒙上加IDBSessionFactory接口

AType[] myType = new AType[10];

6、修改BaseBLL类的调用方式,添加如下代码:

购置了新本本,忙了一些天系,终于开始了针对值类型和援类型做只完美的讲述了,本系列开篇之常虽是因想念写这个主题,才起矣写个系列之想法。所以本着值类型和援类型的解析,是本人太想念成文的同样首,其原因是病故底读过程被自己就打这主题开始,喜欢以IL语言来分析执行,也爱不释手好从底层的长河来深切了解。这对准自我吧,似乎是平等桩找到了卓有成效增长的措施,所以想写的激动就没有住了,旨在以实惠的方式来享受所得。同时,我啊道,对值类型和援类型的把,是知道语言功底环节的重要主题,有必要花力气来了解以及深深。  

Ctrl+S后自动生成DBSession类

1. 引言

View Code

引用类型嵌套在值类型时,内存的分配情况为:该引用类型将作为值类型的成员变量,堆栈上将保存该成员的援,而成员的实际数目或者保留于托管堆着。例如:

 在此处,使用及了厂来创建对象,后面引入了Spring.net之后,会回过头来优化现有的代码。项目被以到了好多接口,目的是为了解耦,每一个类的天职尽量让那个单一,业务层才于那调用数据层接口,也是为因让肤浅,而未是切实可行。每一个框架其实还是各种设计模式的一个凑合,设计模式是以化解一接近题目,而框架就是为缓解一层层题材了。到现竣工,整个项目之雏形都出来了,但是后续,我们一样步一步来优化,好的框架不是一念之差哪怕能设计得圆满的,而是能够不决的抱修改,可连扩大,不断改进出来的。

经上面的剖析,如果我们现发如下的行时:

DAL项目受到补充加DBSessionFactory类继承IDBSessionFactory接口

援类型(Reference Type),引用类型实例分配在托管堆(managed
heap)上,变量保存了实例数据的内存引用。其于MSDN中之概念为援类型存储对值的内存地址的援,位于堆上。我们由达到图能够,引用类型可以是自描述类型、指针类型或接口类型。而由描述类型越密切分成数组和相近项目。类类型是虽然可以是用户定义之好像、装箱的值类型和信托。通常声明也以下项目:class、interface、delegate、object、string以及任何的自定义引用类型时,该变量即为援类型。

    <add key="DBSessionFatory" value="DAL.DBSessionFactory" />
    <add key="DBSessionFatoryDLL" value="E:\WorkSpace\Study\Webs\MVC\OAsln\Web\bin\DAL.dll" />

2.2.1. 内存机制

View Code

图片 5 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IDAL
{
public partial interface IDBSession
{
   IBill_LeaveDAL IBill_LeaveDAL{get;set;}
   IoldWF_AutoTransactNodeDAL IoldWF_AutoTransactNodeDAL{get;set;}
   IoldWF_BillFlowNodeDAL IoldWF_BillFlowNodeDAL{get;set;}
   IoldWF_BillFlowNodeRemarkDAL IoldWF_BillFlowNodeRemarkDAL{get;set;}
   IoldWF_BillStateDAL IoldWF_BillStateDAL{get;set;}
   IoldWF_NodeDAL IoldWF_NodeDAL{get;set;}
   IoldWF_NodeStateDAL IoldWF_NodeStateDAL{get;set;}
   IoldWF_WorkFlowDAL IoldWF_WorkFlowDAL{get;set;}
   IoldWF_WorkFlowNodeDAL IoldWF_WorkFlowNodeDAL{get;set;}
   IOu_DepartmentDAL IOu_DepartmentDAL{get;set;}
   IOu_PermissionDAL IOu_PermissionDAL{get;set;}
   IOu_RoleDAL IOu_RoleDAL{get;set;}
   IOu_RolePermissionDAL IOu_RolePermissionDAL{get;set;}
   IOu_UserInfoDAL IOu_UserInfoDAL{get;set;}
   IOu_UserRoleDAL IOu_UserRoleDAL{get;set;}
   IOu_UserVipPermissionDAL IOu_UserVipPermissionDAL{get;set;}
   IW_WorkFlowDAL IW_WorkFlowDAL{get;set;}
   IW_WorkFlowBranchDAL IW_WorkFlowBranchDAL{get;set;}
   IW_WorkFlowNodeDAL IW_WorkFlowNodeDAL{get;set;}
   IW_WrokFlowRoleDAL IW_WrokFlowRoleDAL{get;set;}
   IWR_WorkFlowApplyDAL IWR_WorkFlowApplyDAL{get;set;}
   IWR_WrokFlowApplyDetailsDAL IWR_WrokFlowApplyDetailsDAL{get;set;}
}
}

 

图片 6图片 7

值类型(Value
Type),值类型实例通常分配在线程的仓库(stack)上,并且不分包其他针对实例数据的指针,因为变量本身便含了实在例数。其在MSDN的概念也值类型直接包含它们的数目,值类型的实例要么在库房上,要么内联在布局面临。我们由达到图能够,值类型主要概括简单类型、结构体类型和枚举类型等。通常声明也以下项目:int、char、float、long、bool、double、struct、enum、short、byte、decimal、sbyte、uint、ulong、ushort等时,该变量即为值类型。  

图片 8图片 9

正文将介绍以下内容:

2、在DAL项目中落实IDBSession接口

2.2.2. 嵌套结构 

图片 10图片 11

从上回《第七扭:品味类型—从通用型系统开始》我们掌握,CLR支持有限种为主项目:值类型援类型。因此,还是把MSDN这张藏视图拿出来开只铺垫。

View Code

图片 12  

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#><#@ output extension=".cs"#> 
<#
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this, 1);
MetadataTools ef = new MetadataTools(this);
string inputFile = @"..\MODEL\OA.edmx";
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
string namespaceName = code.VsNamespaceSuggestion();
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IDAL;

namespace DAL
{
public partial class DBSession:IDBSession
{
<#
int index=0;
    // Emit Entity Types
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
index++;
#>
    #region <#=index #> 数据接口 I<#=entity.Name#>DAL
   I<#=entity.Name#>DAL i<#=entity.Name#>DAL;
  public I<#=entity.Name#>DAL I<#=entity.Name#>DAL{
   get
   {
   if(i<#=entity.Name#>DAL==null)
      i<#=entity.Name#>DAL=new <#=entity.Name#>DAL();
      return  i<#=entity.Name#>DAL;
   }
   set
   {
    i<#=entity.Name#>DAL=value;
   }
   }
   #endregion

<#}#>
}
}

图片 13 

5、Common项目遭到,添加ConfigurationHelper.cs来操作配置文件

public struct NestedRefinValue
{
    public MyClass myClass;
    public NestedRefinValue
    {
        myClass.X = 1;
        myClass.Y = 2;
    }
}

按照系列目录:ASP.NET
MVC4符合帮派及精通系列目录汇总

值类型如果嵌套在援类型时,也就算是值类型在内联的组织面临时常,其内存分配是什么体统也?
其实大简短,例如类的私字段如果为值类型,那她看作援类型实例的如出一辙有的,也分配在托管堆上。例如:

Web.config中补充加如下配置节点:

public class Test
{
    static void Main()
    {
        //定义值类型及援类型,并完成初始化
        MyStruct myStruct = new MyStruct();
        MyClass myClass = new MyClass();
        
        //定义另一个值类型和援类型,
        //以便了解该内存区别
        MyStruct myStruct2 = new MyStruct();
        myStruct2 = myStruct;
        
        MyClass myClass2 = new MyClass();
        myClass2 = myClass;        
    }
}

DAL项目中新建DBContextFactory类继承IDBContextFactory接口

脚简单的排有我们项目的愈加划分,数据出自MSDN,为之是受咱们的定义受到出清晰的档次概念,这是不过基础为是不过要的始末。

        /// <summary>
        /// 2.0 数据仓储接口(相当于数据层工厂,可以创建所有的数据子类对象)
        /// </summary>
        private IDAL.IDBSession iDbSession;

        #region 数据仓储 属性 + IDBSession DBSession
        /// <summary>
        /// 数据仓储 属性
        /// </summary>
        public IDAL.IDBSession DBSession
        {
            get
            {
                if (iDbSession == null)
                {
                    //1.读取配置文件
                    string strFactoryDLL = Common.ConfigurationHelper.AppSetting("DBSessionFatoryDLL");
                    string strFactoryType = Common.ConfigurationHelper.AppSetting("DBSessionFatory");
                    //2.1通过反射创建 DBSessionFactory 工厂对象
                    Assembly dalDLL = Assembly.LoadFrom(strFactoryDLL);
                    Type typeDBSessionFatory = dalDLL.GetType(strFactoryType);
                    IDAL.IDBSessionFactory sessionFactory = Activator.CreateInstance(typeDBSessionFatory) as IDAL.IDBSessionFactory;
                    //2.2根据配置文件内容 使用 DI层里的Spring.Net 创建 DBSessionFactory 工厂对象


                    //3.通过 工厂 创建 DBSession对象
                    iDbSession = sessionFactory.GetDBSession();
                }
                return iDbSession;
            }
        }
        #endregion

using System;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IDAL;

namespace DAL
{
public partial class DBSession:IDBSession
{
    #region 1 数据接口 IBill_LeaveDAL
   IBill_LeaveDAL iBill_LeaveDAL;
  public IBill_LeaveDAL IBill_LeaveDAL{
   get
   {
   if(iBill_LeaveDAL==null)
      iBill_LeaveDAL=new Bill_LeaveDAL();
      return  iBill_LeaveDAL;
   }
   set
   {
    iBill_LeaveDAL=value;
   }
   }
   #endregion

    #region 2 数据接口 IoldWF_AutoTransactNodeDAL
   IoldWF_AutoTransactNodeDAL ioldWF_AutoTransactNodeDAL;
  public IoldWF_AutoTransactNodeDAL IoldWF_AutoTransactNodeDAL{
   get
   {
   if(ioldWF_AutoTransactNodeDAL==null)
      ioldWF_AutoTransactNodeDAL=new oldWF_AutoTransactNodeDAL();
      return  ioldWF_AutoTransactNodeDAL;
   }
   set
   {
    ioldWF_AutoTransactNodeDAL=value;
   }
   }
   #endregion

    #region 3 数据接口 IoldWF_BillFlowNodeDAL
   IoldWF_BillFlowNodeDAL ioldWF_BillFlowNodeDAL;
  public IoldWF_BillFlowNodeDAL IoldWF_BillFlowNodeDAL{
   get
   {
   if(ioldWF_BillFlowNodeDAL==null)
      ioldWF_BillFlowNodeDAL=new oldWF_BillFlowNodeDAL();
      return  ioldWF_BillFlowNodeDAL;
   }
   set
   {
    ioldWF_BillFlowNodeDAL=value;
   }
   }
   #endregion

    #region 4 数据接口 IoldWF_BillFlowNodeRemarkDAL
   IoldWF_BillFlowNodeRemarkDAL ioldWF_BillFlowNodeRemarkDAL;
  public IoldWF_BillFlowNodeRemarkDAL IoldWF_BillFlowNodeRemarkDAL{
   get
   {
   if(ioldWF_BillFlowNodeRemarkDAL==null)
      ioldWF_BillFlowNodeRemarkDAL=new oldWF_BillFlowNodeRemarkDAL();
      return  ioldWF_BillFlowNodeRemarkDAL;
   }
   set
   {
    ioldWF_BillFlowNodeRemarkDAL=value;
   }
   }
   #endregion

    #region 5 数据接口 IoldWF_BillStateDAL
   IoldWF_BillStateDAL ioldWF_BillStateDAL;
  public IoldWF_BillStateDAL IoldWF_BillStateDAL{
   get
   {
   if(ioldWF_BillStateDAL==null)
      ioldWF_BillStateDAL=new oldWF_BillStateDAL();
      return  ioldWF_BillStateDAL;
   }
   set
   {
    ioldWF_BillStateDAL=value;
   }
   }
   #endregion

    #region 6 数据接口 IoldWF_NodeDAL
   IoldWF_NodeDAL ioldWF_NodeDAL;
  public IoldWF_NodeDAL IoldWF_NodeDAL{
   get
   {
   if(ioldWF_NodeDAL==null)
      ioldWF_NodeDAL=new oldWF_NodeDAL();
      return  ioldWF_NodeDAL;
   }
   set
   {
    ioldWF_NodeDAL=value;
   }
   }
   #endregion

    #region 7 数据接口 IoldWF_NodeStateDAL
   IoldWF_NodeStateDAL ioldWF_NodeStateDAL;
  public IoldWF_NodeStateDAL IoldWF_NodeStateDAL{
   get
   {
   if(ioldWF_NodeStateDAL==null)
      ioldWF_NodeStateDAL=new oldWF_NodeStateDAL();
      return  ioldWF_NodeStateDAL;
   }
   set
   {
    ioldWF_NodeStateDAL=value;
   }
   }
   #endregion

    #region 8 数据接口 IoldWF_WorkFlowDAL
   IoldWF_WorkFlowDAL ioldWF_WorkFlowDAL;
  public IoldWF_WorkFlowDAL IoldWF_WorkFlowDAL{
   get
   {
   if(ioldWF_WorkFlowDAL==null)
      ioldWF_WorkFlowDAL=new oldWF_WorkFlowDAL();
      return  ioldWF_WorkFlowDAL;
   }
   set
   {
    ioldWF_WorkFlowDAL=value;
   }
   }
   #endregion

    #region 9 数据接口 IoldWF_WorkFlowNodeDAL
   IoldWF_WorkFlowNodeDAL ioldWF_WorkFlowNodeDAL;
  public IoldWF_WorkFlowNodeDAL IoldWF_WorkFlowNodeDAL{
   get
   {
   if(ioldWF_WorkFlowNodeDAL==null)
      ioldWF_WorkFlowNodeDAL=new oldWF_WorkFlowNodeDAL();
      return  ioldWF_WorkFlowNodeDAL;
   }
   set
   {
    ioldWF_WorkFlowNodeDAL=value;
   }
   }
   #endregion

    #region 10 数据接口 IOu_DepartmentDAL
   IOu_DepartmentDAL iOu_DepartmentDAL;
  public IOu_DepartmentDAL IOu_DepartmentDAL{
   get
   {
   if(iOu_DepartmentDAL==null)
      iOu_DepartmentDAL=new Ou_DepartmentDAL();
      return  iOu_DepartmentDAL;
   }
   set
   {
    iOu_DepartmentDAL=value;
   }
   }
   #endregion

    #region 11 数据接口 IOu_PermissionDAL
   IOu_PermissionDAL iOu_PermissionDAL;
  public IOu_PermissionDAL IOu_PermissionDAL{
   get
   {
   if(iOu_PermissionDAL==null)
      iOu_PermissionDAL=new Ou_PermissionDAL();
      return  iOu_PermissionDAL;
   }
   set
   {
    iOu_PermissionDAL=value;
   }
   }
   #endregion

    #region 12 数据接口 IOu_RoleDAL
   IOu_RoleDAL iOu_RoleDAL;
  public IOu_RoleDAL IOu_RoleDAL{
   get
   {
   if(iOu_RoleDAL==null)
      iOu_RoleDAL=new Ou_RoleDAL();
      return  iOu_RoleDAL;
   }
   set
   {
    iOu_RoleDAL=value;
   }
   }
   #endregion

    #region 13 数据接口 IOu_RolePermissionDAL
   IOu_RolePermissionDAL iOu_RolePermissionDAL;
  public IOu_RolePermissionDAL IOu_RolePermissionDAL{
   get
   {
   if(iOu_RolePermissionDAL==null)
      iOu_RolePermissionDAL=new Ou_RolePermissionDAL();
      return  iOu_RolePermissionDAL;
   }
   set
   {
    iOu_RolePermissionDAL=value;
   }
   }
   #endregion

    #region 14 数据接口 IOu_UserInfoDAL
   IOu_UserInfoDAL iOu_UserInfoDAL;
  public IOu_UserInfoDAL IOu_UserInfoDAL{
   get
   {
   if(iOu_UserInfoDAL==null)
      iOu_UserInfoDAL=new Ou_UserInfoDAL();
      return  iOu_UserInfoDAL;
   }
   set
   {
    iOu_UserInfoDAL=value;
   }
   }
   #endregion

    #region 15 数据接口 IOu_UserRoleDAL
   IOu_UserRoleDAL iOu_UserRoleDAL;
  public IOu_UserRoleDAL IOu_UserRoleDAL{
   get
   {
   if(iOu_UserRoleDAL==null)
      iOu_UserRoleDAL=new Ou_UserRoleDAL();
      return  iOu_UserRoleDAL;
   }
   set
   {
    iOu_UserRoleDAL=value;
   }
   }
   #endregion

    #region 16 数据接口 IOu_UserVipPermissionDAL
   IOu_UserVipPermissionDAL iOu_UserVipPermissionDAL;
  public IOu_UserVipPermissionDAL IOu_UserVipPermissionDAL{
   get
   {
   if(iOu_UserVipPermissionDAL==null)
      iOu_UserVipPermissionDAL=new Ou_UserVipPermissionDAL();
      return  iOu_UserVipPermissionDAL;
   }
   set
   {
    iOu_UserVipPermissionDAL=value;
   }
   }
   #endregion

    #region 17 数据接口 IW_WorkFlowDAL
   IW_WorkFlowDAL iW_WorkFlowDAL;
  public IW_WorkFlowDAL IW_WorkFlowDAL{
   get
   {
   if(iW_WorkFlowDAL==null)
      iW_WorkFlowDAL=new W_WorkFlowDAL();
      return  iW_WorkFlowDAL;
   }
   set
   {
    iW_WorkFlowDAL=value;
   }
   }
   #endregion

    #region 18 数据接口 IW_WorkFlowBranchDAL
   IW_WorkFlowBranchDAL iW_WorkFlowBranchDAL;
  public IW_WorkFlowBranchDAL IW_WorkFlowBranchDAL{
   get
   {
   if(iW_WorkFlowBranchDAL==null)
      iW_WorkFlowBranchDAL=new W_WorkFlowBranchDAL();
      return  iW_WorkFlowBranchDAL;
   }
   set
   {
    iW_WorkFlowBranchDAL=value;
   }
   }
   #endregion

    #region 19 数据接口 IW_WorkFlowNodeDAL
   IW_WorkFlowNodeDAL iW_WorkFlowNodeDAL;
  public IW_WorkFlowNodeDAL IW_WorkFlowNodeDAL{
   get
   {
   if(iW_WorkFlowNodeDAL==null)
      iW_WorkFlowNodeDAL=new W_WorkFlowNodeDAL();
      return  iW_WorkFlowNodeDAL;
   }
   set
   {
    iW_WorkFlowNodeDAL=value;
   }
   }
   #endregion

    #region 20 数据接口 IW_WrokFlowRoleDAL
   IW_WrokFlowRoleDAL iW_WrokFlowRoleDAL;
  public IW_WrokFlowRoleDAL IW_WrokFlowRoleDAL{
   get
   {
   if(iW_WrokFlowRoleDAL==null)
      iW_WrokFlowRoleDAL=new W_WrokFlowRoleDAL();
      return  iW_WrokFlowRoleDAL;
   }
   set
   {
    iW_WrokFlowRoleDAL=value;
   }
   }
   #endregion

    #region 21 数据接口 IWR_WorkFlowApplyDAL
   IWR_WorkFlowApplyDAL iWR_WorkFlowApplyDAL;
  public IWR_WorkFlowApplyDAL IWR_WorkFlowApplyDAL{
   get
   {
   if(iWR_WorkFlowApplyDAL==null)
      iWR_WorkFlowApplyDAL=new WR_WorkFlowApplyDAL();
      return  iWR_WorkFlowApplyDAL;
   }
   set
   {
    iWR_WorkFlowApplyDAL=value;
   }
   }
   #endregion

    #region 22 数据接口 IWR_WrokFlowApplyDetailsDAL
   IWR_WrokFlowApplyDetailsDAL iWR_WrokFlowApplyDetailsDAL;
  public IWR_WrokFlowApplyDetailsDAL IWR_WrokFlowApplyDetailsDAL{
   get
   {
   if(iWR_WrokFlowApplyDetailsDAL==null)
      iWR_WrokFlowApplyDetailsDAL=new WR_WrokFlowApplyDetailsDAL();
      return  iWR_WrokFlowApplyDetailsDAL;
   }
   set
   {
    iWR_WrokFlowApplyDetailsDAL=value;
   }
   }
   #endregion

}
}

那么.NET的内存分配机制如何呢?

using System.Runtime.Remoting.Messaging;
using IDAL;

namespace DAL
{
    public class DBSessionFactory : IDBSessionFactory
    {
        /// <summary>
        /// 此方法的作用: 提高效率,在线程中 共用一个 DBSession 对象!
        /// </summary>
        /// <returns></returns>
        public IDBSession GetDBSession()
        {
            //从当前线程中 获取 DBContext 数据仓储 对象
            IDBSession dbSesion = CallContext.GetData(typeof(DBSessionFactory).Name) as DBSession;
            if (dbSesion == null)
            {
                dbSesion = new DBSession();
                CallContext.SetData(typeof(DBSessionFactory).Name, dbSesion);
            }
            return dbSesion;
        }
    }
}

嵌套结构即是于值类型中嵌套定义了援类型,或者当援类型变量中嵌套定义了价值类型,相信园子中有关这无异话题的阐释以及关爱且未是累累。因此我们特别有必不可少发挥一下,在此就顺藤摸瓜,从上文对.NET的内存机制入手来喻会水至渠道成。

当上述的经过被,我们独家定义了价值类型变量myStruct和援类型变量myClass,并利用new操作符完成内存分配与初始化操作,此处new的别可以详细《第五转头:深入浅出重点字—把new说发》 
的阐释,在这不举行越来越描述。而我们在此强调的是myStruct和myClass两只变量在内存分配方面的区分,还是因为一个明确的觊觎来显示一下:

2. 尽由内存开始

于内存分配的再度详实位置,可以描述如下:

再详细的辨析,我引进《类型实例的创始位置、托管对象在托管堆上的结构》。

那个内存分配图可以代表也:

public class NestedValueinRef

  //aInt举行呢援类型的同一组成部分用分配在托管堆上 
  private int aInt;  
  public NestedValueinRef 
  { 
    //aChar则分配在该段代码的线程栈上 
     char achar = ‘a’; 
  }