.net C#中私有类的概念

5vf7fwbs  于 2023-03-24  发布在  .NET
关注(0)|答案(6)|浏览(153)

私有类可以存在于C#中,而不是内部类中吗?

mcdcgff0

mcdcgff01#

简单地说没有。除非它在嵌套类中,否则什么都没有

  • 未嵌套在其他类或结构中的类和结构可以是publicinternal。声明为public的类型可由任何其他类型访问。声明为internal的类型仅可由同一程序集中的类型访问。除非在类定义中添加关键字public,否则类和结构默认声明为internal
  • 类或结构定义可以添加internal关键字以使其访问级别显式。访问修饰符不影响类或结构本身-它始终可以访问自身及其所有成员。
  • 结构成员(包括嵌套类和结构)可以声明为public、internal或private。类成员(包括嵌套类和结构)可以是public、protected internal、protected、internal或private。默认情况下,类成员和结构成员(包括嵌套类和结构)的访问级别为private。无法从包含类型的外部访问private嵌套类型。
  • 派生类不能比它们的基类具有更大的可访问性。换句话说,你不能有一个从内部类A派生的公共类B。如果允许这样做,它将使A成为公共的,因为A的所有受保护或内部成员都可以从派生类访问。

您可以使用InternalsVisibleToAttribute使特定的其他程序集能够访问您的内部类型。

pkwftd7m

pkwftd7m2#

不,没有。除非是嵌套的,否则不能有私有类。

eblbsuwk

eblbsuwk3#

在什么情况下,那么对于一个内部类,你想有一个“私人”类?
可以使用internal修饰符创建仅在当前程序集中可见的类。

// the class below is only visible inside the assembly in where it was declared
internal class MyClass
{
}
lnxxn5zx

lnxxn5zx4#

不。这样一个类的作用域是什么?

ajsxfq5m

ajsxfq5m5#

我们可以在其他类中将一个类声明为Private。请在下面的代码中找到如何实现相同的目标:

public class Class1
  {
    temp _temp ;
    public Class1()
    {
      _temp = new temp();   
    }    

    public void SetTempClass(string p_str, int p_Int)
    {
      _temp.setVar(p_str, p_Int);
    }

    public string GetTempClassStr()
    {
      return _temp.GetStr();
    }

    public int GetTempClassInt()
    {
      return _temp.GetInt();
    }

    private class temp
    {
      string str;
      int i;

      public void setVar(string p_str, int p_int)
      {
        str = p_str;
        i = p_int;
      }

      public string GetStr()
      {
        return str;
      }

      public int GetInt()
      {
        return i;
      }
    }
  }
xcitsw88

xcitsw886#

C# 11添加了file-local types。带有file访问修饰符的类型只能在声明它们的源文件中使用。
例如,您可以在一个文件中声明文件本地类Foo

// file1.cs
namespace Test;

file class Foo {}

class FooFactory
{
    public static object CreateFoo() => new Foo();
}

在另一个文件中,您不能通过名称Foo引用类型:

// file2.cs

using System;

namespace Test;

class Program
{
    public static void Main()
    {
         // Prints something like:
         // "Test.<file1>EF2345065A04F90B2A4EE01E86C4DF23B0AF1B96D7D3F7CC9046D1F1C5EADFB80__Foo"
         Console.WriteLine(FooFactory.CreateFoo());
         // Does not compile with error:
         // "The type or namespace name 'Foo' could not be found"
         new Foo();
    }
}

从这个例子中可以看出,C#编译器在编译时给每个文件本地类一个唯一的名字。这允许多个文件定义一个同名的文件本地类,并且在运行时不会相互干扰。

相关问题