如何在C#中正确隐藏类中的助手(内部)类

dis*_*nte 2 c# class-design class

我在理解如何正确封装我的课时遇到问题.它是(或应该是)一个不可改变的类.

我正在使用"帮助类",我希望它不能从外部访问.

namespace MyApp
{

    [Flags]
    public enum OctaveGroups
    {
        None = 0,
        oneOctave = 1
    }

    class Frequencies
    {
        // HelperClass
        public class Frequency
        {
            public string Name { get;  set; }
            public OctaveGroups Octave { get; set; }
        }

        public readonly static List<Frequency> All = new List<Frequency>
        {
        #region Complete Frequencies Data

                new Frequency { Name = "63", Hz = 63,
                    Octave = OctaveGroups.oneOctave | OctaveGroups.None,
                    },

                new Frequency { Name = "80", Hz = 80,
                    Octave = OctaveGroups.None,
                    }
           // And so on..
                //..

        #endregion
        };


        public readonly List<Frequency> OneOctave = All.Where(f => f.Octave.HasFlag(OctaveGroups.oneOctave)).ToList();

        public readonly List<Frequency> None = All.Where(f => f.Octave.HasFlag(OctaveGroups.None)).ToList();

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我Frequency上课protectedprivate我收到此错误:

可访问性不一致:字段类型"列表"比字段'Frequencies.All'更难访问

如果我制作class FrequencyList<Frequency> All保护并尝试创建一个返回List<Frequency>类似的方法,我会得到相同的错误:

public List<Frequency> GetAll()
    {
        return All.Where(f => f.Octave.HasFlag(OctaveGroups.OneOctave)).ToList();
    } 
Run Code Online (Sandbox Code Playgroud)

在保持只读.All .OneOctave.None字段的同时公开just 和fields 的正确方法怎么样?

InB*_*een 6

Frequency当您计划返回公共方法时,您不能指望隐藏List<Frequency>.

现在,我的理解是你的问题是,你需要访问的属性setter FrequencyFrequencies,但你不希望他们暴露于外部.这样做的方法是通过一个只暴露getter的接口:

public interface IFrequency
{
    string Name { get; }
    OctaveGroups Octave { get; }  
}
Run Code Online (Sandbox Code Playgroud)

现在,您创建Frequencies.Frequency了一个私有嵌套类,并且只公开IFrequency:

class Frequencies
{
    // HelperClass
    private class Frequency: IFrequency
    {
        public string Name { get;  set; }
        public OctaveGroups Octave { get; set; }
    }

    public readonly static List<IFrequency> All = new List<IFrequency>
    {
    #region Complete Frequencies Data

            new Frequency { Name = "63", Hz = 63,
                Octave = OctaveGroups.oneOctave | OctaveGroups.None,
                },

            new Frequency { Name = "80", Hz = 80,
                Octave = OctaveGroups.None,
                }
       // And so on..
            //..

    #endregion
    };


    public readonly List<IFrequency> OneOctave = All.Where(f => f.Octave.HasFlag(OctaveGroups.oneOctave)).ToList();

    public readonly List<IFrequency> None = All.Where(f => f.Octave.HasFlag(OctaveGroups.None)).ToList();

}
Run Code Online (Sandbox Code Playgroud)

现在,消费者Frequencies只会看到IFrequency没有暴露的情况,因此对外界是不可变的(当然不包括反射).