7

在 Delphi 中,private修饰符可能是唯一的:

Contoso = class
private
   procedure DoStuff();
end;

你会认为 C# 相当于:

class Contoso
{
   private void DoStuff()
   {
   }
}

但是在 Delphi 中,private关键字是 more unit friend。换句话说,同一代码文件中的其他类可以访问私有成员。将 Delphi 转码为 C#,相当于以下代码的工作:

public class Contoso
{
   private void DoStuff()
   {
   }
}

internal class Fabrikam
{
   Contoso _contoso;

   //constructor
   Fabrikam()
   {
      _contoso = new Contoso();
      _contoso.DoStuff(); //i can call a private method of another class
   }
}

即使该方法DoStuff是私有的,同一文件中的Contoso其他类也可以调用该方法。

我不想要的是制作方法internal

class Contoso
{
   internal void DoStuff();
}

因为然后程序集中的其他代码可以看到或调用该DoStuff方法;我不想要。


C# 是否支持某种单位朋友单位内部访问修饰符?

4

2 回答 2

8

不完全是。

在 C# 中,您可以将成员声明为internal,这使同一程序集中的类(代码)可以访问该成员。这与 Delphi 的 Unit 访问规则具有或多或少相同的用法。

范围更广,但您拥有更多控制权。

您明确表示您不想要这个,但请考虑用例。在 Delphi 中,您不情愿地授予所有私有成员的访问权限。并且您无法将每个班级放在自己的单元中。

在 .NET 中,一个程序集是 1 个项目,在一个程序集中管理不需要的访问很容易。为世界其他地方竖起栅栏更为重要。

您不能限制文件边界,因为文件在 C# 中几乎没有意义。IL 中不存在文件边界,这样的规则可能与部分类发生冲突。

于 2013-08-15T21:20:03.417 回答
2

在 C# 中定义类的文件实际上并没有多大意义——您可以在一个文件中拥有多个位于不同命名空间中的类,并且可以将类拆分到多个文件(部分类)中。

C# 中不存在与 delphi 相同的访问级别 - 在 C# 中,您可以通过 protected 访问继承的类,通过 internal 或在同一类中访问同一程序集中的类,并通过 private 访问嵌套类。

也许您正在寻找的是一个嵌套类 - 如果没有具体的例子,很难说。

于 2013-08-15T21:23:03.853 回答