C# 如何限制对嵌套类的访问';是否仅将属性设置器设置为外部类?

C# 如何限制对嵌套类的访问';是否仅将属性设置器设置为外部类?,c#,C#,是否有一个访问修饰符或其组合来限制对外部类的访问 对于下面嵌套类PanelFragment的Position属性,我只希望包含类ViewPagerPanels能够设置它(通过setter,我意识到这也可以通过构造函数参数来实现) 公共类ParcelView:MXActivityView、ViewPager.IOnPageChangeListener、IfFragmentToViewPageRevent { 私有视图页面面板_页面面板; 创建时受保护的覆盖无效(捆绑包) { base.OnCrea

是否有一个访问修饰符或其组合来限制对外部类的访问

对于下面嵌套类
PanelFragment
Position
属性,我只希望包含类
ViewPagerPanels
能够设置它(通过setter,我意识到这也可以通过构造函数参数来实现)

公共类ParcelView:MXActivityView、ViewPager.IOnPageChangeListener、IfFragmentToViewPageRevent
{
私有视图页面面板_页面面板;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
_pagerPanels=newviewPagerPanels(5);//5:幻数,输入int常量
_pagerPanels[0]=新的ViewPagerPanels.PanelFragment(typeof(ViewA));
// ...
}
私有类ViewPagerPanels
{
公共类PanelFragment
{
公共片段片段{get;set;}
//??访问set的修改器
公共int位置{get;private set;}
}
公共只读int面板计数;
私人面板碎片[]_面板;
公共视图页面面板(整数计数)
{
面板计数=计数;
_面板=新的面板碎片[面板计数];
}
本文件的公共部分[int i]
{
得到
{
返回面板[i];
}
设置
{
_面板[i]=价值;
//!!-无法访问私有属性
_面板[i]。位置=i;
}
}
}
}

不,不可能直接做。最严格的访问修饰符,
private
,已经允许从同一类中进行访问。其他每一个修改器都会进一步扩展该访问

每个类,无论是嵌套的、私有的还是公共的,都始终可以访问它自己声明的每个成员,没有机会对自己应用限制。我们能得到的最接近的方法是使用
readonly
字段(或getter-only属性),防止声明类修改构造函数外部的变量。但是对于读写操作,我们已经没有选择了。

一个可能的解决方法

public int Position { get; private set; }
public int InitPosition { set { Position = value; } }
或者,取决于你对无getter属性的哲学观点

public void InitPosition(int value) { Position = value; }

对于这种类型的保护场景,有一种解决方案。但是你应该做以下改变

1-用接口或抽象类替换具体类,并将其公开给外部世界

2-使用具体的类实现此接口

3-通过工厂方法控制此类的创建

4-通过将接口(或抽象类)强制转换为私有类类型来设置属性

示例代码更改

public interface IPanelFragment
{
        Fragment Fragment { get; set; }
        // ?? - access modifer for set
        int Position { get; }
}

class PanelFragment : IPanelFragment
{
      public Fragment Fragment { get; set; }
      // ?? - access modifer for set
      public int Position { get; set; }
}

private IPanelFragment[] _panels;

public IPanelFragment CreateFragment(Fragment fragment, int pos)
{
     return new PanelFragment() { Fragment= fragment, Position = pos };
}

public IPanelFragment this[int i]
{
      get
      {
          return _panels[i];
      }

      set
      {
           _panels[i] = value;
           // !! - cannot access private property
           ((PanelFragment)_panels[i]).Position = i;
       }
  } 

所以没有“嵌套私有”修饰符?很高兴知道我现在至少可以结束我的搜索了,谢谢。如果你不介意名称空间污染,你可以用
internal
@BurnsBA解决问题。我正在尝试限制访问,
internal
提供对包含程序集的公共访问,对吗?是的,它对包含程序集是公共的。看,我被这个问题弄糊涂了。PanelFragment是私有类ViewPagerPanels的公共成员,因此唯一可以访问PanelFragment的代码是您编写的ParcelView的成员。这听起来像是在问“如何阻止自己编写我不想编写的代码?”没有编译器设置。如果您不希望除ViewPagerPanel之外的任何ParcelView成员访问PanelFragment,那么请不要编写这样做的代码!这都是你的密码!如果其他人最终完成了这项工作,那么让那个人就如何使用私有实现细节做出正确的决定。“将来可能会有人写不好的代码”是让代码清晰、文档化和组织化的一个很好的理由。在设计扩展点(如虚拟方法、受保护字段等)时要非常小心,这是一个很好的理由。但每次我都会看到这样的问题,可以归结为“如何防止我自己/我的同事编写糟糕的代码?”这是一个强大的代码审查文化的工作,而不是更多种类的访问修饰符。但这仍然允许嵌套类设置值,除了容器类之外。@Alejandro
Position
现在只能通过
InitPosition
进行设置,而不能通过容器类或其他方式意外/无意地使用
Position
。我甚至可以将它们重命名为
ReadPosition
WritePosition
,但我认为现在这应该足够了(我认为这段代码已经被废弃了,只是为了一个列表)。这不就是将问题转移到另一个属性/方法吗<除了父类之外,还可以从容器类调用code>InitPosition。虽然名称不同。@Alejandro是的,但它通过添加一个“层”来帮助防止误用,更为明确,因为我没有编译器,更不希望在运行时抛出异常(我认为这会特别隐蔽)。
public interface IPanelFragment
{
        Fragment Fragment { get; set; }
        // ?? - access modifer for set
        int Position { get; }
}

class PanelFragment : IPanelFragment
{
      public Fragment Fragment { get; set; }
      // ?? - access modifer for set
      public int Position { get; set; }
}

private IPanelFragment[] _panels;

public IPanelFragment CreateFragment(Fragment fragment, int pos)
{
     return new PanelFragment() { Fragment= fragment, Position = pos };
}

public IPanelFragment this[int i]
{
      get
      {
          return _panels[i];
      }

      set
      {
           _panels[i] = value;
           // !! - cannot access private property
           ((PanelFragment)_panels[i]).Position = i;
       }
  }