• C# 基础系列程序集一


      类的可访问属性有public,private,protect,innertal,protect internal.其中internal只有在同一程序集的文件中,内部类型或成员才是可访问。下面就用这个来继续程序集的事例。

    namespace AssemblyLibrary
    {
        internal class InternalClass
        {
            public int ID { get; set; }
        }
    
        public class PulClass
        {
            public int ID { get; set; }
    
            public InternalClass Inter { get; set; }
        }
    }

    你们说这个编译能通过吗?很明显,如果基础好点同学,不用编译器就可以看出,这个是有语法错误的。作为类的属性来说,属性的访问性不能高于类型的访问性。

    vs中我们可以看到程序集名称,那是不是如果我们修改为同一个程序集名称,那么internal就可以访问了呢?

    那我修改测试用的控制台的程序集名称为:AssemblyLibrary,结果非常沮丧。如果你说,这个事类库和控制台,不是同一个类型的问题,那好,我们再做别一个实验,我们再新建一个类库,工程名:AssemblyLibrary2.程序集:AssemblyLibrary,默认命名空间:AssemblyLibrary。现在我们两个类库的程序集和命名空间都一样。我们开始下面的实验

    namespace AssemblyLibrary
    {
        public class Show
        {
            public int ID { get; set; }
        }
    }

    工程:AssemblyLibrary中我们修改代码为

    namespace AssemblyLibrary
    {
        internal class InternalClass
        {
            public int ID { get; set; }
        }
    
        public class PulClass
        {
            public int ID { get; set; }
    
            internal InternalClass Inter { get; set; }
    
            public Show SHOW { get; set; }
        }
    }

    现在工程的目录是这样的 ,AssemblyLibrary引用AssemblyLibrary2.

    按F6编译,OK。没有问题。

    我们用ILSPY看看编译的dll是怎么样的?

     

    很神奇,里面只有一个dll。先不说这个,我们反编译一把。

    在Ilspy中我们看到dll的程序集信息// AssemblyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

    using System;
    namespace AssemblyLibrary
    {
        public class PulClass
        {
            public int ID
            {
                get;
                set;
            }
            internal InternalClass Inter
            {
                get;
                set;
            }
            public Show SHOW
            {
                get;
                set;
            }
        }
    }

    OK,和我们写的代码是一模一样的,但是怎么点击Show 都无法跳转到相关的类中。而点击InternalClass ,可以完整的看到里面的内容。

     

    但是,这里我们又可以看到Show的信息,这真是个有意思的现象。

    好,现在我们重新加载ConsolTest并修改下代码

    namespace AssemblyLibrary
    {
        class Program
        {
            static void Main(string[] args)
            {
                PulClass pu = new PulClass();
                pu.ID = 1;
                pu.SHOW = null;
                Console.Read();
    
            }
        }
    }

    结果是多么糟糕,虽然pu.SHOW智能提示可以显示,但是来个错误:

    错误 5 现用语言不支持“AssemblyLibrary.PulClass.SHOW” d:\documents\visual studio 2010\Projects\ConsolTest\ConsolTest\Program.cs 15 16 ConsolTest

    那我们这样//pu.SHOW = null;会是怎么呢,没有错误了,但是多了4个警告。我们先无视他吧,F5,看下是神马情况。

    抛出了System.TypeLoadException错误

    未能从程序集“AssemblyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“AssemblyLibrary.PulClass”。

     

    好吧,这是多么沮丧的实验,发现原来我们不懂程序集。

    不知不觉,发现 这一页已经很多内容了,看样要多页来阐述这个程序集了

  • 相关阅读:
    PAT 1007 Maximum Subsequence Sum 最大连续子序列和
    数据库系统原理课程设计——图书借阅管理系统
    计算机组成原理——数据的表示与运用
    win7系统下安装Ubuntu18.04组成双系统
    C++中set用法详解
    C++ getline函数用法详解
    数据库——关系演算
    计算机组成原理——计算机系统概述考研题
    PAT 1002 A+B for Polynomials(map模拟)
    PAT 1001 A+B Format
  • 原文地址:https://www.cnblogs.com/qionghua/p/2586087.html
Copyright © 2020-2023  润新知