23.命名空间

23.面向对象关联知识点-命名空间


23.1 知识点

命名空间的基本概念

命名空间是用来组织和重用代码的。它类似于一个工具包,其中的类就像工具一样,都是声明在命名空间中的。

命名空间的使用

任何语句块外

// 基本语法
// namespace 命名空间名
// {
//   类
//   类
// }

// 实例
namespace MyGame
{
    class GameObject
    {

    }
}

// 同名类,但在不同命名空间中
namespace MyGame
{
    class Player : GameObject
    {

    }
}

namespace YouGame
{
    class Player : GameObject
    {

    }

不同命名空间中相互使用,需要引用命名空间或指明出处

代码最前面

// 引用MyGame命名空间
// 能在namespace Lesson21_面向对象相关_命名空间 使用MyGame命名空间相关的类
using System;
using MyGame;

主函数内

// 引用MyGame命名空间
// 能在namespace Lesson21_面向对象相关_命名空间 使用MyGame命名空间的GameObject类
GameObject gameObject1 = new GameObject();

// 不引用MyGame命名空间,又想使用MyGame命名空间的GameObject类
// 需要遵循命名空间.类名的语法,在GameObject前加上MyGame.
MyGame.GameObject gameObject2 = new GameObject();

不同命名空间中允许有同名类

任何语句块外

// 申明MyGame2命名空间,再申明GameObject类
// 就算MyGame里也有GameObject类,也不会报错
namespace MyGame2
{
    // 在不同的命名空间中是可以有同名类的
    class GameObject
    {

    }
}

主函数内

// 同时引用了MyGame命名空间和MyGame2命名空间
// 直接使用GameObject类会报错
// 因为MyGame命名空间和MyGame2命名空间里都有GameObject类
// 分不清楚用的是哪个命名空间的类
// 这个时候又要指明出处
// 遵循命名空间.类名的语法
// MyGame.GameObject MyGame2.GameObject 来区分

命名空间可以包裹命名空间

任何语句块外

// 类比内部类来学习
// 大命名空间
namespace MyGame
{
    // 内部可以有小命名空间
    namespace UI
    {
        class Image
        {

        }
    }

    namespace Game
    {
        class Image
        {

        }
    }
}

代码最前面

// 不引用MyGame.UI,只引用MyGame
// 不能直接使用MyGame.UI里的类,要逐个命名空间点出来
using MyGame.UI;

主函数内

// 引用MyGame.UI,能直接使用MyGame.UI里的Image类
Image img1 = new Image();

// 不引用MyGame.UI,只引用MyGame
// 不能直接使用MyGame.UI里的Image类,要逐个命名空间点出来
MyGame.UI.Image img2 = new MyGame.UI.Image();

// MyGame.Game中的同理
MyGame.Game.Image img3 = new MyGame.Game.Image();

关于修饰类的访问修饰符

  • public —— 公有类
  • protected —— 继承类,在继承链上的类里面都可以使用
  • internal —— 程序集中的类,默认为internal,只能在相同程序集中使用,即在同一个项目中的任何代码中都可以调用,包括继承链上的类,不在继承链上的类除外。
  • protected internal —— 程序集中的和继承类。protectedinternal 能使用的地方都能使用。protected internal 修饰的成员可以跨程序集(或者说跨项目)被调用,只要在另一个项目中声明一个属于继承链上的类就可以调用被 protected internal 修饰的成员(但是在另一个项目的别的地方不能调用)。
  • abstract —— 抽象类
  • sealed —— 密封类
  • partial —— 分部类

总结

  • 命名空间是个工具包,用来管理类。
  • 不同命名空间中可以有同名类。
  • 不同命名空间中相互使用需要使用 using 引用命名空间或者指明出处。
  • 命名空间可以包裹命名空间。

23.2 知识点代码

//代码最前面
#region 知识点三 不同命名空间中相互使用 需要引用命名空间或指明出处

//引用MyGame命名空间
//能在namespace Lesson21_面向对象相关_命名空间 使用MyGame命名空间相关的类
using System;
using MyGame;


#endregion

#region 知识点五 命名空间可以包裹命名空间
//不引用MyGame.UI只引用yGame 不能直接使用MyGame.UI里的类 要逐个命名空间点出来
using MyGame.UI;
#endregion





//任何语句块外

#region 知识点一 命名空间的基本概念
//概念:命名空间是用来组织和重用代码的
//作用:就像是一个工具包,类就像是一件一件的工具,都是申明在命名空间中的
#endregion

#region 知识点二 命名空间的使用

//基本语法
//namespace 命名空间名
//{
//  类
//  类
//}

//实例
namespace MyGame
{
    class GameObject
    {

    }
}

//可以是同名的 类似于类中的分布类
namespace MyGame
{
    //报错 同一个命名空间不能有同名类
    //class GameObject
    //{

    //}

    class Player:GameObject
    {

    }
}

namespace YouGame
{
    class Player : GameObject
    {

    }
}

#endregion

#region 知识点四 不同命名空间中允许有同名类

//申明MyGame2命名空间 再申明GameObject类 就算MyGame里也有GameObject类 也不会报错
namespace MyGame2
{
    //在不同的命名空间中 是可以有同名类的
    class GameObject
    {

    }
}

#endregion

#region 知识点五 命名空间可以包裹命名空间

//类比内部类来学习
//大命名空间
namespace MyGame
{
    //内部可以有小命名空间
    namespace UI
    {
        class Image
        {

        }
    }

    namespace Game
    {
        class Image
        {

        }
    }
}


#endregion

#region 知识点六 关于修饰类的访问修饰符
//public   —— 公有类
//protected  —— 继承类  在继承链上的类里面都可以使用
//internal —— 程序集中的类 默认为internal
//只能在相同程序集中可以使用,换句话说就是在同一个项目中的任何代码中都可以调用,包括继承链上的类,不在继承链上的类,但出了项目就没办法使用了。
//protected internal ———— 程序集中的和继承类protected和internal能使用的地方都能使用
//protected internal修饰的成员可以跨程序集(或者说跨项目)被调用
//只要在另一个项目中声明一个属于继承链上的类就可以调用被protected internal修饰的成员(但是在另一个项目的别的地方不能调用)。
//abstract —— 抽象类
//sealed   —— 密封类
//partial  —— 分部类
#endregion

namespace Lesson21_面向对象相关_命名空间
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("命名空间");

            //主函数内

            #region 知识点三 不同命名空间中相互使用 需要引用命名空间或指明出处

            //引用MyGame命名空间
            //能在namespace Lesson21_面向对象相关_命名空间 使用MyGame命名空间的GameObject类
            GameObject gameObject1 = new GameObject();

            //不引用MyGame命名空间 又想使用MyGame命名空间的GameObject类
            //需要遵循 命名空间.类名的语法 在GameObject前加上MyGame.
            MyGame.GameObject gameObject2 = new GameObject();

            #endregion

            #region 知识点四 不同命名空间中允许有同名类

            //假如同时引用了MyGame命名空间和MyGame2命名空间
            //直接使用GameObject类会报错
            //因为MyGame命名空间和MyGame2命名空间里都有GameObject类
            //分不清楚用的是哪个命名空间的类
            //这个时候又要指明出处
            //遵循 命名空间.类名的语法
            //MyGame.GameObject MyGame2.GameObject 来区分

            #endregion

            #region 知识点五 命名空间可以包裹命名空间

            //引用MyGame.UI 能直接使用MyGame.UI里的Image类
            Image img1 = new Image();

            //不引用MyGame.UI只引用yGame 不能直接使用MyGame.UI里的Image类 要逐个命名空间点出来
            MyGame.UI.Image img2 = new MyGame.UI.Image();

            //MyGame.Game中的同理
            MyGame.Game.Image img3 = new MyGame.Game.Image();

            #endregion

        }
    }
}

//总结
//1.命名空间是个工具包 用来管理类的
//2.不同命名空间中 可以有同名类
//3.不同命名空间中相互使用 需要using引用命名空间 或者 指明出处
//4.命名空间可以包裹命名空间

23.3 练习题

请说明关键词using有什么作用

  • using 关键字在 C# 中有两种主要用途:
    引用命名空间: using 用于引用命名空间,以便在代码中可以直接使用该命名空间中的类型,而无需使用完全限定名。
    资源管理: using 还用于管理资源,例如文件、数据库连接、网络流等,通过在 using 代码块结束时自动释放资源,确保资源的正确释放。

有两个命名空间,UI(用户界面)和Graph(图表),两个命名空间中都有一个Image类,请在主函数中实例化两个不同命名空间中的Image对象

任何语句块外

// 命名空间 UI
namespace UI
{
    class Image
    {

    }
}

// 命名空间 Graph
namespace Graph
{
    class Image
    {

    }
}

代码最前面

// 引用两个自己写的命名空间
using System;
using UI;
using Graph;

主函数内

// 主函数内
// 引用两个自己写的命名空间后 要逐个点出Image类 否则报错 不知道引用的哪个命名空间的类
UI.Image uiImg = new UI.Image();
Graph.Image grImg = new Graph.Image();

这样,通过使用 using 关键字,可以更方便地在主函数中实例化两个不同命名空间中的 Image 对象。


23.4 练习题代码

//代码最前面
#region 练习题二
//引用两个自己写的命名空间
using System;
using UI;
using Graph;
#endregion



#region 练习题一
//请说明关键词using有什么作用

//using是用来引用命名空间 引用命名空间才能使用命名空间内的内容
#endregion

//任何语句块外

#region 练习题二
//有两个命名空间,UI(用户界面)和Graph(图表)
//两个命名空间中都有一个Image类
//请在主函数中实例化两个不同命名空间中的Image对象


//声明两个空间 里面都有Image类
namespace UI
{
    class Image
    {

    }
}

namespace Graph
{
    class Image
    {

    }
}

#endregion

namespace Lesson21_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("命名空间练习题");

            //主函数内
            #region 练习题二

            //引用两个自己写的命名空间后 要逐个点出Image类 否则报错 不知道引用的哪个命名空间的类
            UI.Image uiImg = new UI.Image();
            Graph.Image grImg = new Graph.Image();

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏