限制在C#中使用结构

Dan*_*zyk 2 c# struct data-structures c#-4.0

好吧,让我说我有一个像这样的结构A:

Struct A{
    private String _SomeText;
    private int _SomeValue;

    public A(String someText, int SomeValue) { /*.. set the initial values..*/ }

    public String SomeText{ get { return _SomeText; } }
    public int SomeValue{ get { return _SomeValue; } }
}
Run Code Online (Sandbox Code Playgroud)

现在我想要做的是返回结构A作为类ABC中的方法的结果,如下所示:

Class ABC{
    public A getStructA(){
        //creation of Struct A
        return a;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不希望任何程序员使用我的库(它将具有Struct A和Class ABC以及更多东西)来创建Struct A的实例.
我希望创建它的唯一方法是作为返回来自getStructA()方法.然后可以通过适当的getter访问这些值.

那么有什么方法可以设置这样的限制吗?那么一个结构不能在某个类之外实例化?使用C#,.Net4.0.

谢谢你的帮助.

---编辑:----
添加一些细节我为什么要实现这个目标:

  • 我的班级ABC有一些人可以查询的"状态".此状态有2个字符串值,然后是长整数列表.
  • 从来没有必要由程序员创建"状态"的对象/实例,状态只能由类的"getStatus()"函数返回.
  • 我不想将这3个字段拆分为不同的方法,因为要获取它们我正在调用Windows API(p/invoke),它返回所有3个字段的类似结构.
  • 如果我确实要将它拆分为3个方法而不使用struct,那么每次调用这3个方法中的一个时,我都必须缓存结果或从Windows API调用该方法...

所以我可以创建一个公共结构,程序员可以根据需要实例化它,这对他们来说没用,因为没有方法可以接受它作为参数.或者我可以以这样的方式构造库:只有当从方法返回时,才能获得此结构(或者如果它使事情变得更容易将其更改为类).

Eri*_*ert 10

如果"受限制"类型是结构,那么不,没有办法做到这一点.结构必须至少与工厂方法一样公开,如果结构是公共的,那么它可以使用其默认构造函数构造.但是,您可以这样做:

public struct A
{
    private string s;
    private int i;
    internal bool valid;
    internal A(string s, int i)
    {
        this.s = s;
        this.i = i;
        this.valid = true;
    } 
    ...
Run Code Online (Sandbox Code Playgroud)

现在您可以让您的库代码检查"有效"标志.A的实例只能通过(1)通过库内部可以调用内部构造函数的方法,或者(2)通过默认构造函数来实现.您可以使用有效标志区分它们.

很多人建议使用界面,但这有点无意义; 使用结构的全部意义在于获取值类型语义,然后将其装入接口.你最好还是让它成为一个班级.如果它将成为一个类,那么肯定可以制造工厂方法; 只是让班上的所有人都在内部.

当然,我希望不言而喻,不应该使用这些设备来实现能够抵抗完全信任用户攻击的代码.请记住,这个系统可以保护好用户免受不良代码的侵害,而不是来自坏用户的好代码.没有什么可以阻止完全受信任的用户代码通过反射调用它们在库中所需的任何私有方法,或者就此而言,使用不安全的代码更改结构中的位.