我正在构建一个目标是读取,处理和输出MNIST数据的类。
出于清洁的目的,我决定让用户只能访问数据读取方法Readfile()
。
我试图找出返回数据的最佳方法,并且已经摆弄:
至于现在,我一直想知道是否可以在公共方法中返回私有结构,并且可能以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);
}
}
答案 0 :(得分:3)
您无法从公共函数返回私有类型。唯一的方法是创建公共函数object
的返回类型,因为所有类型都是从它派生的,或dynamic
,它将所有类型检查和方法绑定推迟到运行时。但是,如果有任何选择,则存在一些缺点:
我真正想要实现的是返回一个无法通过调用MNISTReader类直接访问的对象。
您可以做的一件事是使构造函数内部,这样只有它所在的程序集可以创建实例。但如果您希望客户端能够使用其属性或方法,则类型必须为public
。
我还要注意,您的要求中没有任何内容表明DataPair
应该是一个结构。制作struct
的选择更多地是关于它的值类型语义,而不是它的可访问性。
答案 1 :(得分:1)
如果方法返回一个类型,那么该类型必须是&#34; as visible&#34;作为方法本身。
这只是因为消费代码需要能够理解返回的对象。它是一个类或结构在这方面没有任何区别。 C#是一种静态类型语言,因此编译器需要能够保证使用该方法的任何代码都知道返回类型。
对于图书馆来说,隐藏&#34;非常普遍。内部类型,只是暴露一些结构/ DTO /等。公开让图书馆的消费者与之互动。请保持struct
公开,以便public
方法的消费者能够理解它。
如果您不希望在类/库/等之外显示该特定类型,请创建另一种类型以便使用代码来接收数据。一个没有任何功能的简单DTO(这就是你在发布的代码中已经拥有的东西)可以很好地完成工作。