C#是否有类似Delphi中的private修饰符?

7
在Delphi中,`private`修饰符很可能是唯一的:
Contoso = class
private
   procedure DoStuff();
end;

你可能会认为这有C#的等价物:
class Contoso
{
   private void DoStuff()
   {
   }
}

但在Delphi中,private关键字更像是单元友好型。换句话说,同一代码文件中的其他类可以访问私有成员。将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#是否支持某种单元友元单元内部访问修饰符?

5
通常情况下,一个.cs文件中不会放置多于一个类或接口,因此我真的看不出这样做的意义所在。对我来说,这听起来更像是命名空间的一种变通方法。 - Federico Berasategui
我同意@HighCore的观点,这更像是一种变通方法。如果您有应该只在文件内共享的代码,则应该是相同的类。不要因为想让它们更小而创建额外的类。 - Logarr
@HighCore 相关的类在同一个独立的命名空间中。但是我只想要一个文件来分享(即不超过一个文件,也不是一个程序集)。 - Ian Boyd
2个回答

8
并不完全如此。 在C#中,您可以将成员声明为“internal”,这使得同一程序集中的类(代码)可以访问该成员。 这与Delphi的Unit访问规则基本相同。 范围更广,但您有更多的控制权。 您明确表示您不想要这个功能,但请考虑使用情况。 在Delphi中,您无意中给出了对所有私有成员的访问权。 同时防止将每个类放入其自己的单位。 在.NET中,一个程序集是1个项目,管理一个程序集内部的不需要访问变得容易了。 将防护栏放在世界其他地方更为重要。 您不能限制文件边界,因为文件在C#中几乎没有意义。 文件边界不存在于IL中,而且这样的规则可能会与部分类冲突。

4
如果你希望一个内部类在不同程序集中的另一个类中可见(想想内部API),你也可以使用InternalsVisibleTo属性。http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx - Darlene

2

在C#中,类定义所在的文件并没有太多意义 - 你可以在同一个文件中拥有多个不同命名空间的类,并且你可以将一个类分割成多个文件(部分类)。

C#中不存在与Delphi相同级别的访问权限 - 在C#中,你可以通过protected给继承类授权,通过internal给同一程序集中的类授权,或者通过private授权给同一类及嵌套类。

也许你正在寻找的是嵌套类 - 没有具体示例很难说清楚。


+1 提到了嵌套类。我经常忘记这种方法。 - Logarr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接