C#的namespace和Java的package

C#的namespace和Java的package

Java中的package

在java中我们一般谈到package都知道这是java的包机,在java中为了方便类和类之间的管理我们引入了package用来解决这个问题,例如

package com.edu.test
public class A{
    public static void Test();
}

在另一个包中的另一个类中我们要想访问类A我们需要借助import关键字

import com.edu.test.A
public class B{
    public void Test2(){
        A.Test();
    }
}

当然为了访问其他包中的类我们需要public关键字,同样的为了直接调用方法我们需要关键字static声明静态方法。

Java包的作用

  • 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  • 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  • 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

创建包时需要注意如下几点:

(1)创建包时用package关键字;

(2)如果有包声明,包声明一定作为源代码的第一行;

(3)包的名称一般为小写,包名要有意义。例如:数学计算包名可以命名“math”,再如,绘图包可以命名“drawing”;

C#中的namespace

声明一个namespace(命名空间)

namespace myApp
{
  public class Program
  {
    public static void Test()
  }
}

如上所示这样我们就可以在C#中声明一个命名空间

Java的package和C#的namespace的最大区别

  • namespace是可以嵌套的
namespace A
{
  namespace B
  {
    namespace C
    {

    }
  }
}

测试

  • 新建一个文件Program.cs
using System;

namespace myApp
{
    namespace Test{
        class Program2
        {
            public static void Test1()
            {
                Console.WriteLine("This is namespace Test, Class Program2, Method Test1");
            }
        }
    }
    public class Program
    {   
        public static void Test3()
        {
            Console.WriteLine("Now using namespace myApp Class Program");
        }
    }
}

如上所示我们有两个命名空间分别是myApp和Test

  • 新建一个文件Program2.cs
using myApp;
using System;

namespace myApp2
{
    class Program3
    {
        public static void Test2()
        {
            Program.Test3();
        }

        public static void Test3()
        {
            myApp.Test.Program2.Test1();
        }

        static void Main(String[] args)
        {
            Test2();
            Test3();
        }
    }
}

和java一样我们需要导入我们的命名空间这里我们使用using关键字 例如:using myApp

  • 这里新建了一个命名空间myApp2
  • 新建了两个方法Test2Test3
  • Test2方法调用myApp命名空间中的Program
  • Test3方法调用myApp命名空间的子命名空间Test中的Program1类的Test1方法

输出

已加载“/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5/System.Private.CoreLib.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
已加载“/Users/rex/Desktop/Code/dotnet/myApp/bin/Debug/netcoreapp2.2/myApp.dll”。已加载符号。
已加载“/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5/System.Runtime.dll”。模块已生成,不包含符号。
已加载“/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5/System.Console.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
已加载“/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5/System.Threading.dll”。模块已生成,不包含符号。
已加载“/usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.5/System.Runtime.Extensions.dll”。模块已生成,不包含符号。
Now using namespace myApp Class Program
This is namespace Test, Class Program2, Method Test1
程序“[41008] myApp.dll”已退出,代码为 0 (0x0)

如上所示我们已经完成的调用

总结

  • Java的package和C#的namespace都是为了更方便的管理类
  • C#的namespace支持子namespace