unity的C#学习——命名空间的定义与访问、using语句的常见用法


命名空间

在C#中,命名空间(Namespace)是一种将类和其他相关类型组织在一起的方式。可以将命名空间看作是一个容器,用于管理和组织类和其他类型。通过将相关的类型组织在一起,可以使代码更加清晰和易于维护。

命名空间的主要目的是为了避免名称冲突,使得开发人员可以使用相同名称来命名不同的类型

1、命名空间的定义与访问

命名空间的定义是以关键字 namespace 开始,后跟命名空间的名称,如下所示:

// 定义命名空间
namespace namespace_name
{
    
    
   // 代码声明
}

// 嵌套定义命名空间
namespace namespace_name1 
{
    
    
   // 代码声明
   namespace namespace_name2 
   {
    
    
     // 代码声明
   }
}
  • C#中的命名空间可以包含其他命名空间和类,即命名空间可以嵌套,并且可以在同一个文件中定义多个命名空间
  • 在命名空间中定义的类型可以通过完全限定名称(包括命名空间和类型名称)namespace_name.item_name;
    来访问。
  • 例如,如果在命名空间A中定义了一个类B,那么可以使用A.B的方式来访问这个类。
using System;

// 定义命名空间1
namespace first_space
{
    
    
   // 定义命名空间1中的类
   class namespace_cl
   {
    
    
      // 定义命名空间1中的方法,输出字符串"Inside first_space"
      public void func()
      {
    
    
         Console.WriteLine("Inside first_space");
      }
   }
}

// 定义命名空间2
namespace second_space
{
    
    
   // 定义命名空间2中的类
   class namespace_cl
   {
    
    
      // 定义命名空间2中的方法,输出字符串"Inside second_space"
      public void func()
      {
    
    
         Console.WriteLine("Inside second_space");
      }
   }
}

// 定义测试类,位于全局命名空间中
class TestClass
{
    
    
   static void Main(string[] args)
   {
    
    
      // 通过完全限定名称,创建命名空间1中的类的实例
      first_space.namespace_cl fc = new first_space.namespace_cl();
      // 通过完全限定名称,创建命名空间2中的类的实例
      second_space.namespace_cl sc = new second_space.namespace_cl();

      // 调用命名空间1中的方法,输出字符串"Inside first_space"
      fc.func();
      // 调用命名空间2中的方法,输出字符串"Inside second_space"
      sc.func();

      Console.ReadKey();
   }
}
  • 可以注意到,类可以放在命名空间中,也可以不放:
    • 如果不放在命名空间中,则它默认属于全局命名空间
    • 如果放在命名空间中,则需要使用完全限定名称来引用该类

当上面的代码被编译和执行时,它会产生下列结果:

Inside first_space
Inside second_space

2、全局命名空间的访问

在 C# 中,如果没有指定任何命名空间,代码就会被放置在全局命名空间中。这意味着在同一个程序集中的所有代码都可以访问这些全局命名空间中定义的类型和成员,而不需要任何特殊的引用

以下是一个简单的示例,演示了一个类放置在全局命名空间中的情况:

class GlobalClass
{
    
    
    public void GlobalMethod()
    {
    
    
        Console.WriteLine("This is a method in the global namespace.");
    }
}

namespace MyNamespace
{
    
    
    class MyClass
    {
    
    
        public void MyMethod()
        {
    
    
            // 可以直接访问全局命名空间中的类型和成员
            GlobalClass gc = new GlobalClass();
            gc.GlobalMethod();
        }
    }
}

在上面的代码中,GlobalClass 类被放置在全局命名空间中,而 MyClass 类被放置在 MyNamespace 命名空间中。在 MyMethod 方法中,可以直接访问 GlobalClass 类型和 GlobalMethod 方法,而不需要特别的命名空间引用。

3、程序集间访问命名空间

使用命名空间可以使得代码更加模块化和可重用,也可以使得代码更加易于组织和维护。在C#中,有许多预定义的命名空间,例如常见的SystemSystem.Collections,用于包含常用的类和类型。开发人员还可以定义自己的命名空间来组织自己的代码。

当我们在另一个程序集中想要使用当前程序集定义的类型,就需要在另一个程序集中通过using语句导入对应的命名空间,具体方法将在下面介绍。


using语句

在 C# 中,using 语句主要用于定义一个代码块,在该代码块结束时自动释放资源。这可以避免在程序执行过程中出现资源泄漏的问题,因为在使用资源的代码块结束时,using 语句会自动调用 Dispose 方法来释放资源。

但using语句的用法却不仅仅局限于上述一种,下面将介绍几种using语句的常见用法。

1、引入命名空间

在C#中,命名空间用于组织代码和避免命名冲突。如果要使用命名空间中的类型,需要通过using语句引入。引入后,就可以直接使用该命名空间中的类型,而不需要使用完全限定名(类似于python中的import导包)

例如,要使用System.Collections.Generic命名空间中的List类型,可以在代码文件的开头添加以下语句:

using System.Collections.Generic;

这样,在代码中就可以直接使用List类型,而不需要使用完全限定名System.Collections.Generic.List

using System;
using System.Collections.Generic;

class Program
{
    
    
    static void Main()
    {
    
    
        List<int> numbers = new List<int>();
        numbers.Add(1);
        numbers.Add(2);
        numbers.Add(3);
        Console.WriteLine("Count = " + numbers.Count);
    }
}

对与我们自己定义的命名空间,也是同样的使用方法。以下是一个示例代码,其中命名空间MyNamespace定义了一个类MyClass

// 自定义的命名空间
namespace MyNamespace
{
    
    
    public class MyClass
    {
    
    
        public void MyMethod()
        {
    
    
            Console.WriteLine("Hello, World!");
        }
    }
}

在另一个程序集中,可以通过以下方式引用并使用MyClass

// 引入命名空间
using MyNamespace;

class Program
{
    
    
    static void Main(string[] args)
    {
    
    	// 直接使用定义的类
        MyClass obj = new MyClass();
        obj.MyMethod();
    }
}

2、自动释放资源

在C#中,有些类型需要手动释放资源,否则可能会造成内存泄漏或其他问题。例如,FileStream类型用于操作文件流,必须手动关闭才能释放资源。

为了方便起见,C#提供了using语句来自动释放资源。using语句创建一个作用域,在作用域结束时自动释放资源。例如,以下代码使用using语句打开文件流,并在使用后自动关闭:

using (var fileStream = new FileStream("example.txt", FileMode.Open))
{
    
    
    // 在此处使用文件流
}

在using语句中创建的文件流会在作用域结束时自动关闭,不需要手动调用Close方法。

需要注意的是,只有实现了IDisposable接口的类型才能使用using语句进行自动释放资源。因此,如果使用using语句,需要确保所使用的类型实现了IDisposable接口。

3、起别名

在 C# 中,可以使用 using 关键字来为一个命名空间或类型起别名,以便在代码中使用更简短的名称

例如,如果你想在代码中频繁使用 System.Collections.Generic 命名空间中的 List<T> 类,可以使用 using 关键字为其起一个别名。以下是使用 using 关键字为命名空间和类型起别名的示例:

using Alias = System.Collections.Generic.List<string>;

// 使用别名
Alias list = new Alias();
list.Add("hello");
list.Add("world");

在上面的示例中,我们使用 using 关键字为 System.Collections.Generic 命名空间中的 List<string> 类型起了一个别名 Alias。然后,我们可以在代码中使用别名 Alias 来创建新的 List<string> 对象并进行操作。

4、using static 指令

在C# 6及以上版本引入了 using static 指令,它允许在代码中使用静态成员,而不需要每次都通过类型名来访问

使用 using static 指令,可以将一个静态类的成员方法或属性导入到当前代码文件的(全局)命名空间中,从而可以直接使用方法或属性名称,而不需要通过类名来访问。

这种语法糖可以使代码更加简洁易读。以下是使用 using static 指令的示例:

using static System.Math;

public class Program
{
    
    
    public static void Main(string[] args)
    {
    
    
        double a = 3;
        double b = 4;
        double c = Sqrt(a * a + b * b);
        Console.WriteLine($"The hypotenuse of a right triangle with legs {
      
      a} and {
      
      b} is {
      
      c}.");
    }
}

在上面的示例中,我们使用 using static 指令导入了 System.Math 静态类中的全部方法,从而可以直接使用 Sqrt 方法,而不需要通过 Math 类名来访问。这样可以使代码更加简洁易读。

  • 需要注意的是,使用 using static 指令可能会导致命名冲突,因此应该谨慎使用。

猜你喜欢

转载自blog.csdn.net/qq_50571974/article/details/129593455