c# - 限制在 C# 中使用结构

标签 c# c#-4.0 data-structures struct

好吧,假设我有一个这样的结构 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; } }
}

现在我想要做的是返回结构 A 作为类 ABC 中方法的结果,就像这样:

Class ABC{
    public A getStructA(){
        //creation of Struct A
        return a;
    }
}

我不希望任何程序员使用我的库(它将包含 Struct A 和 Class ABC 以及更多内容)来创建 Struct A 的实例。
我希望创建它的唯一方法是从 getStructA() 方法返回。然后可以通过适当的 getter 访问这些值。

那么有没有办法设置这样的限制呢?那么 Structure 不能在某个类之外实例化吗?使用 C#、.Net4.0。

感谢您的帮助。

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

  • 我的类(class) ABC 有一些人可以查询的“状态”。此状态有 2 个字符串值,然后是一长串整数。
  • 程序员永远不需要创建“状态”的对象/实例,状态只能通过类的“getStatus()”函数返回。
  • 我不想将这 3 个字段拆分为不同的方法,为了获得它们,我调用 Windows API (p/invoke),它返回包含所有 3 个字段的相似结构。
  • 如果我确实要将其拆分为 3 个方法而不使用该结构,则每次调用这 3 个方法之一时,我将不得不缓存结果或从 Windows API 调用方法...

所以我可以创建一个公共(public)结构,程序员可以根据需要实例化它,这对他们来说毫无用处,因为没有方法可以接受它作为参数。或者,我可以以这种结构(或者如果它使事情更容易的话,将其更改为一个类)只能作为方法的返回获得的方式构建库。

最佳答案

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

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

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

很多人建议使用接口(interface),但这有点毫无意义;使用结构的全部意义在于获取值类型语义,然后将其装箱到接口(interface)中。您不妨首先将其设为一个类。如果它是一个类,那么当然可以制作一个工厂方法;只需将类(class)的所有 Actor 设为内部即可。

当然,我希望不言而喻,不应该使用这些工具中的任何一个来实现能够抵抗完全信任的用户攻击的代码。请记住,该系统旨在保护好用户免受坏代码的侵害,而不是保护好代码免受坏用户的侵害。没有任何东西可以阻止完全受信任的用户代码通过反射在您的库中调用他们想要的任何私有(private)方法,或者就此而言,使用不安全代码更改结构中的位。

关于c# - 限制在 C# 中使用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14755682/

相关文章:

c++ - 构建非循环依赖的最简单、最有效的数据结构是什么?

c# - 检测何时连接新显示器

c# - 在 Linq 中删除查询

c# - ValidateAntiForgeryToken 用途、解释和示例

visual-studio-2010 - C# 从不同的文件夹加载 DLL?

xml - 为什么 XmlDocument 在 .NET 4 中不是动态的?

python - 如何从包含来自多个来源的多个词典的列表中创建数据框

c# - 如何在Web api中压缩HttpClient post并接收数据

c++ - 通过 USB 串行端口(C++ 控制台应用程序)在 Arduino 和 PC 之间进行通信

c - 数据结构和患者记录