繁体   English   中英

C#结构/查找表

[英]C# Struct / Lookup Table

说我有一个声明如下的结构:

public struct Test
{
    public static int Width = 5;
    ...
    public static int[] Value = new int[1]{ 0 };
}

现在我想做的是在另一个结构中调用它,但是我必须知道如何做。 我正在尝试做的事情(在我看来)如下所示:

public struct AnotherStruct
{
    public (type of struct) this[int key]
    {
        get
        {
            switch(key)
            {
                case 1:
                    return (another struct);
                default:
                    return null;
            }
        }
    }
}

我的最终目标是,我希望使用如下所示的代码,而不必创建该对象的实例:

structobject s = new AnotherStruct[5];

因此,此“查找表”将在另一个项目中创建并构建,然后从主项目中调用为dll。 由于我正在其他地方构建该dll并对其进行调用,因此希望可以将dll一次加载到内存中,然后可以从我的主项目中引用该内存。 然后,我将为内存分配一个部分,而我的代码将只引用它,而无需创建该查找表的各个实例(从而避免了分配内存和存储新实例所需的时间开销)。 从长远来看,我节省的时间将极大地有益,所以我希望我可以以某种方式使它起作用。

我希望这不要太令人困惑,但请告诉我是否需要澄清。

编辑这是在网站上使用的,因此,实际上,我需要一个在所有连接中均保持不变的对象,并在最初加载代码时创建一次。 相同的想法,但是也许这将使解决方案更简单?

解决方案#1。 对所有结构和词典集合使用通用接口

public interface IStr { }

public struct St1 : IStr
{
    public static int ID = 1;
}
public struct St2 : IStr
{
    public static int ID = 2;
}

public class StructFactory : System.Collections.ObjectModel.KeyedCollection<int, IStr>
{
    public static StructFactory Default = new StructFactory();
    protected override int GetKeyForItem(IStr item)
    {
        FieldInfo finfo = item.GetType().GetField("ID", 
            BindingFlags.Static | BindingFlags.Public);

        return (int)finfo.GetValue(item);
    }

    public StructFactory()
    {
        Add(new St1());
        Add(new St2());
    }
}

class Program
{
    static void Main(string[] args)
    {
        St1 x = (St1)StructFactory.Default[1];
        St2 y = (St2)StructFactory.Default[2];
    }
}

您上面使用的语法不起作用,因为它的意思是“创建一个包含五个元素的AnotherStruct数组”。 但是,正如评论中提到的那样,您确实应该考虑使用工厂模式。

但是,如果您确实要使用上面的模式,则可以对其稍加更改。 让AnotherStruct数组保存每个结构的Type实例。 然后,您的“创建”行将更像:

structobject s = (structobject)Activator.CreateInstance(AnotherStruct[5]);

您可以在Assembly上使用反射(因为您将其包装在DLL中)来获取那些Type对象。

最后,除非您有充分的理由使用struct (并了解所有细微差别,其中有许多细微差别),否则请坚持使用class

解决方案2。 放弃整个ID的想法,只使用结构类型和泛型即可。

public struct St1 
{
}
public struct St2 
{
}

public class Factory<T>
    where T : struct
{
    static T _new = new T(); //cached copy of structure

    public static T New { get { return _new; } }        
}


class Program
{
    static void Main(string[] args)
    {
        St1 x1 = Factory<St1>.New;
        St1 x2 = Factory<St1>.New;
        St1 x3 = Factory<St1>.New;
        St2 y1 = Factory<St2>.New;
        St2 y2 = Factory<St2>.New;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM