在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#是否支持某种单位朋友或单位内部访问修饰符?
答案 0 :(得分:8)
不完全是。
在C#中,您可以将成员声明为internal
,它在与该成员相同的程序集访问权限中提供类(代码)。这与Delphi的单元访问规则或多或少具有相同的用法。
范围更广,但你有更多的控制权。
您明确声明您不希望这样,但请考虑用例。在Delphi中,您不情愿地访问所有私有成员。而且你被阻止将每个班级都放在自己的单位中。
在.NET中,程序集是一个项目,在一个程序集中管理不需要的访问很容易。为世界其他地区设置围栏更为重要。
您不能限制文件边界,因为文件在C#中几乎没有意义。 IL中不存在文件边界,这样的规则可能与部分类冲突。
答案 1 :(得分:2)
定义一个类的文件在C#中并没有那么多意思 - 你可以在一个文件中有多个类,这些类位于不同的命名空间中,你可以将类拆分为多个文件(部分类)。
在C#中没有与delphi中相同的访问级别 - 在C#中,您可以通过protected访问继承的类,通过内部或同一类在同一程序集中访问类,通过私有访问嵌套类
也许您正在寻找的是嵌套类 - 如果没有具体的例子,很难说清楚。