internal修饰符有什么作用呀?

时间:2022-06-20 17:13:07
C#中的访问修饰符internal到底有什么用呀?我分不清它与public的区别,一直没有搞清楚,哪位明白人能给解释明白?最好举出具体例子或代码片断,真心求教了,谢谢!

8 个解决方案

#1


internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的,如下例所示:

public class BaseClass 
{
    // Only accessible within the same assembly
    internal static int x = 0;
}

有关 internal 与其他访问修饰符的比较,请参见可访问性级别和访问修饰符(C# 编程指南)。

有关程序集的更多信息,请参见程序集和全局程序集缓存(C# 编程指南):

内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。例如,用于生成图形用户界面的框架可以提供“控件”类和“窗体”类,这些类通过使用具有内部访问能力的成员进行合作。由于这些成员是内部的,它们不向正在使用框架的代码公开。

从定义具有内部访问能力的类型或成员的程序集外部引用该类型或成员是错误的。

#2


该示例包含两个文件:Assembly1.cs 和 Assembly2.cs。第一个文件包含内部基类 BaseClass。在第二个文件中,实例化 BaseClass 的尝试将产生错误。

// Assembly1.cs
// compile with: /target:library
internal class BaseClass 
{
   public static int intM = 0;
}

// Assembly1_a.cs
// compile with: /reference:Assembly1.dll
class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // CS0122
   }
}

在此示例中,使用与示例 1 中所用的文件相同的文件,并将 BaseClass 的可访问性级别更改为 public。还将成员 IntM 的可访问性级别更改为 internal。在此例中,您可以实例化类,但不能访问内部成员。

// Assembly2.cs
// compile with: /target:library
public class BaseClass 
{
   internal static int intM = 0;
}

// Assembly2_a.cs
// compile with: /reference:Assembly1.dll
public class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // Ok.
      BaseClass.intM = 444;    // CS0117
   }
}

#3


就是这个对象在程序集内是公共的,但是程序集以外引用它不可见。

#4


程序集是什么意思?指的是项目吗?我分不清楚!

#5


比如一个dll或者一个exe就是一个assembly

#6


http://msdn.microsoft.com/zh-cn/library/ba0a1yw2.aspx

#7


是在同一个程序集中的"public",程序集你可以看作是一个项目,比如你自定义控件,自定义类等等。

#8


引用 4 楼  的回复:
程序集是什么意思?指的是项目吗?我分不清楚!

你创建的项目分不同的类型,项目编译之后的我们就可以得到程序集assembly。比如来说,如果你创建一个控制台应用程序,就可以得到一个exe(可执行文件)类型的程序集,如果你创建一个类库类型的项目,编译后就可以得到一个dll(动态链接库)类型的程序集。
一个解决方案,里面可以包括多个程序集,程序集简单一点理解就是程序的集合,里面可以包括很多类。为了划分这些类的使用范围,避免相互冲突,我们就需要对这些类进行限制,限制的方式就是在类及其成员(变量,方法,属性)上添加访问修饰符。如public,private,internal,protected。
internal的作用是描述某个对象(如类,变量,方法,属性)只能在其所在的程序集内使用,也就是说解决方案其他部分的类不能对此对象进行调用。通俗一点说,你的年龄就是internal的,你的家人可以知道,但是外人就不知道。默认情况下,如果没有指定访问修饰符,那么对象就是internal内部的

#1


internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的,如下例所示:

public class BaseClass 
{
    // Only accessible within the same assembly
    internal static int x = 0;
}

有关 internal 与其他访问修饰符的比较,请参见可访问性级别和访问修饰符(C# 编程指南)。

有关程序集的更多信息,请参见程序集和全局程序集缓存(C# 编程指南):

内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。例如,用于生成图形用户界面的框架可以提供“控件”类和“窗体”类,这些类通过使用具有内部访问能力的成员进行合作。由于这些成员是内部的,它们不向正在使用框架的代码公开。

从定义具有内部访问能力的类型或成员的程序集外部引用该类型或成员是错误的。

#2


该示例包含两个文件:Assembly1.cs 和 Assembly2.cs。第一个文件包含内部基类 BaseClass。在第二个文件中,实例化 BaseClass 的尝试将产生错误。

// Assembly1.cs
// compile with: /target:library
internal class BaseClass 
{
   public static int intM = 0;
}

// Assembly1_a.cs
// compile with: /reference:Assembly1.dll
class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // CS0122
   }
}

在此示例中,使用与示例 1 中所用的文件相同的文件,并将 BaseClass 的可访问性级别更改为 public。还将成员 IntM 的可访问性级别更改为 internal。在此例中,您可以实例化类,但不能访问内部成员。

// Assembly2.cs
// compile with: /target:library
public class BaseClass 
{
   internal static int intM = 0;
}

// Assembly2_a.cs
// compile with: /reference:Assembly1.dll
public class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // Ok.
      BaseClass.intM = 444;    // CS0117
   }
}

#3


就是这个对象在程序集内是公共的,但是程序集以外引用它不可见。

#4


程序集是什么意思?指的是项目吗?我分不清楚!

#5


比如一个dll或者一个exe就是一个assembly

#6


http://msdn.microsoft.com/zh-cn/library/ba0a1yw2.aspx

#7


是在同一个程序集中的"public",程序集你可以看作是一个项目,比如你自定义控件,自定义类等等。

#8


引用 4 楼  的回复:
程序集是什么意思?指的是项目吗?我分不清楚!

你创建的项目分不同的类型,项目编译之后的我们就可以得到程序集assembly。比如来说,如果你创建一个控制台应用程序,就可以得到一个exe(可执行文件)类型的程序集,如果你创建一个类库类型的项目,编译后就可以得到一个dll(动态链接库)类型的程序集。
一个解决方案,里面可以包括多个程序集,程序集简单一点理解就是程序的集合,里面可以包括很多类。为了划分这些类的使用范围,避免相互冲突,我们就需要对这些类进行限制,限制的方式就是在类及其成员(变量,方法,属性)上添加访问修饰符。如public,private,internal,protected。
internal的作用是描述某个对象(如类,变量,方法,属性)只能在其所在的程序集内使用,也就是说解决方案其他部分的类不能对此对象进行调用。通俗一点说,你的年龄就是internal的,你的家人可以知道,但是外人就不知道。默认情况下,如果没有指定访问修饰符,那么对象就是internal内部的