私有结构作为公共方法的返回类型

时间:2016-06-01 14:04:16

标签: c# class struct

我正在构建一个目标是读取,处理和输出MNIST数据的类。

出于清洁的目的,我决定让用户只能访问数据读取方法Readfile()

我试图找出返回数据的最佳方法,并且已经摆弄:

  1. 元组,但正如你可以从代码中判断的那样,它变得非常丑陋且几乎无法读取。
  2. ExpandoObjects
  3. 结构(如下面的代码所示)
  4. 至于现在,我一直想知道是否可以在公共方法中返回私有结构,并且可能以var类型捕获它以进一步像对象一样处理它。

    我真正想要实现的是返回一个无法通过调用MNISTReader类直接访问的对象。

    代码:

    abstract class MNISTReader
    {
        // Define structs that hold our data.
        public struct DataPair
        {
            List<byte> Labels { get; set; }
            List<Matrix<byte>> Images { get; set; }
    
            public DataPair(List<byte> labels, List<Matrix<byte>> images)
            {
                this.Labels = labels;
                this.Images = images;
            }
        }
    
        public struct Data
        {
            DataPair Train { get; set; }
            DataPair Validation { get; set; }
            DataPair Test { get; set; }
    
            public Data(DataPair train, DataPair validation, DataPair test)
            {
                this.Train = train;
                this.Validation = validation;
                this.Test = test;
            }
        }
    
        // Method for reading the files and obtaining data.
        public static Data ReadFile()
        {
    
            // IMAGE PROCESSING (CUT OUT)
    
            DataPair train = new DataPair(trainLabels, trainImages);
            DataPair validation = new DataPair(validationLabels, validationImages);
            DataPair test = new DataPair(testLabels, testImages);
    
            return new Data(train, validation, test);
        }
    }
    

2 个答案:

答案 0 :(得分:3)

您无法从公共函数返回私有类型。唯一的方法是创建公共函数object的返回类型,因为所有类型都是从它派生的,或dynamic,它将所有类型检查和方法绑定推迟到运行时。但是,如果有任何选择,则存在一些缺点:

  • 调用者不知道将返回什么类型,它具有什么属性等
  • 在运行时
  • 之前不会发现任何编码错误(拼写错误等)
  

我真正想要实现的是返回一个无法通过调用MNISTReader类直接访问的对象。

您可以做的一件事是使构造函数内部,这样只有它所在的程序集可以创建实例。但如果您希望客户端能够使用其属性或方法,则类型必须为public

我还要注意,您的要求中没有任何内容表明DataPair应该是一个结构。制作struct的选择更多地是关于它的值类型语义,而不是它的可访问性。

答案 1 :(得分:1)

如果方法返回一个类型,那么该类型必须是&#34; as visible&#34;作为方法本身。

这只是因为消费代码需要能够理解返回的对象。它是一个类或结构在这方面没有任何区别。 C#是一种静态类型语言,因此编译器需要能够保证使用该方法的任何代码都知道返回类型。

对于图书馆来说,隐藏&#34;非常普遍。内部类型,只是暴露一些结构/ DTO /等。公开让图书馆的消费者与之互动。请保持struct公开,以便public方法的消费者能够理解它。

如果您不希望在类/库/等之外显示该特定类型,请创建另一种类型以便使用代码来接收数据。一个没有任何功能的简单DTO(这就是你在发布的代码中已经拥有的东西)可以很好地完成工作。