gpt4 book ai didi

c# - 如何在 C# 中限制对其容器的嵌套类的访问?

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:08 24 4
gpt4 key购买 nike

我有一个配置类存储应用程序配置。目前我正在使用静态类。有些配置与一个主题相关,所以我想将它们组织成一个嵌套类,所以我可以这样引用配置:

AppConfig.Url
AppConfig.LogSettings.FileSize

我有两个选择,要么使用静态嵌套类,

public static class AppConfig
{
public static class LogSettings
{
public static int FileSize {get; set;}
}
}

或者声明一个类但是添加一个静态属性:

public static class AppConfig
{
public class LogSettings
{
public int FileSize {get; set;}
}

public static LogSettings logSettings { get; private set; }
}

但是,它们都不能保护被其他类修改的嵌套类成员FileSize,即使我使用private set 来保护公共(public)静态属性。也许我不应该使用嵌套类来实现这个?有什么建议吗?

最佳答案

目前给出的其他解决方案本质上要求设置的属性一次。我非常赞成不可变对象(immutable对象),但它们并不总是实用的;是否可以解决您的问题并使属性可变?

这实际上是您提出的更普遍问题的特例:我们如何将内部类的某些成员标记为可访问外部类,但不是那个 类之外的任何东西?

如何做到这一点并不明显,但这非常容易。解决方案的关键是记住接口(interface)可能是私有(private)实现细节。 C# 要求基类 至少与从它派生的类一样可访问,但 C# 要求实现的接口(interface)作为实现它的类可访问!

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);
}
}

Outer 中的代码可以通过接口(interface)访问Inner 的私有(private)成员。 Outer 之外的代码只能看到 Inner 的公共(public)成员,因为他们需要看到私有(private)成员的接口(interface)本身就是私有(private)的。

关于c# - 如何在 C# 中限制对其容器的嵌套类的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com