cod*_*ior 1 c# inner-classes access-levels
我有一个配置类商店应用程序配置.目前我正在使用静态类.一些配置与一个主题相关,所以我想将它们组织成一个嵌套类,所以我可以引用这样的配置:
AppConfig.Url
AppConfig.LogSettings.FileSize
Run Code Online (Sandbox Code Playgroud)
我有两个选项,要么使用静态嵌套类,
public static class AppConfig
{
public static class LogSettings
{
public static int FileSize {get; set;}
}
}
Run Code Online (Sandbox Code Playgroud)
或声明一个类但添加一个静态属性:
public static class AppConfig
{
public class LogSettings
{
public int FileSize {get; set;}
}
public static LogSettings logSettings { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,它们都不能保护被其他类修改的嵌套类成员FileSize,即使我private set用来保护公共静态属性.也许我不应该使用嵌套类来实现它?有什么建议?
到目前为止给出的其他解决方案基本上要求将属性设置为设置一次.我非常支持不可变对象,但它们并不总是实用的; 是否有可能解决您的问题并使该属性变得可变?
这其实是你造成的更普遍的问题的一个特例:我们如何可以标记一个内部类的某些成员为访问仅在外部类,但没有任何东西外面的那类?
如何做到这一点并不明显,但这非常容易.解决方案的关键是要记住接口可能是私有实现细节.C#需要一个基类至少从它的类派生的访问,但C#也没有要求的实现的接口是可访问的类实现它!
using System;
public static class Outer
{
private interface IPrivates
{
string Name { set; }
}
public readonly static Inner TheInner = new Inner();
private readonly static IPrivates TheInnerPrivates = TheInner;
public class Inner : IPrivates
{
public string Name { get; private set; }
string IPrivates.Name { set { this.Name = value; } }
}
public static void DoIt()
{
TheInnerPrivates.Name = "abc";
}
}
public class Program
{
public static void Main()
{
Outer.DoIt();
Console.WriteLine(Outer.TheInner.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
里面的代码Outer可以Inner通过接口访问私有成员.Outer除了公共成员之外,代码之外的代码看不到Inner,因为他们需要查看私有成员的接口本身就是私有的.
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |