C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 将int(或任何值类型)作为对象存储并将它们转换回int(或值类型)是否有任何成本?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在C#中是否存在将int(或任何值类型)存储为对象并将它们转换回int(或值类型)的成本?

基本上我需要创建一个内存表.我可以创建特定于每种可能类型的“列”(因此任何原始值类型,如int,double,String等,以及我希望存储在表中的用户定义的引用类型,如Order),或者我可以简单地将一切存储为对象并在访问表格时将它们转换回正确的类型.

所以我的问题是哪种方法表现更好或两者都相同?

或者我应该为所有值类型坚持使用特定的“列”并将所有用户定义的引用类型存储为对象?

谢谢 – 下面的示例代码 – 静态测试方法显示用法.

public sealed class columns
{
    public static void test()
    {
        columns cols = new columns(100);
        cols.SeTint(0,Int_column,12345);
        int value = cols.GeTint(0,Int_column);

        cols.SetObject(1,Object_column,12345);
        int value2 = (int)cols.GetObject(1,Object_column);
    }

    private const int Int_column = 0;
    private const int String_column = 1;
    private const int Object_column = 2;

    privatE int[] _intCol;
    private String[] _StringCol;
    private object[] _objCol;

    public columns(int rowCount)
    {
        _intCol = new int[rowCount];
        _StringCol = new String[rowCount];
        _objCol = new object[rowCount];
    }

    public void SeTint(int rowIndex,int colIndex,int @R_772_7548@
    {
        switch(colIndeX)
        {
            casE int_column:
                _intCol[rowIndex] = value;
                break;
            default:
                throw new Exception("Incorrect column index specified.");
        }
    }

    public int GeTint(int rowIndex,int colIndeX)
    {
        switch(colIndeX)
        {
            casE int_column:
                return _intCol[rowIndex];
            default:
                throw new Exception("Incorrect column index specified.");
        }
    }

    public void SetString(int rowIndex,String @R_772_7548@
    {
        switch(colIndeX)
        {
            case String_column:
                _StringCol[rowIndex] = value;
                break;
            default:
                throw new Exception("Incorrect column index specified.");
        }
    }

    public String GetString(int rowIndex,int colIndeX)
    {
        switch(colIndeX)
        {
            case String_column:
                return _StringCol[rowIndex];
            default:
                throw new Exception("Incorrect column index specified.");
        }
    }

    public void SetObject(int rowIndex,object @R_772_7548@
    {
        switch(colIndeX)
        {
            case Object_column:
                _objCol[rowIndex] = value;
                break;
            default:
                throw new Exception("Incorrect column index specified.");
        }
    }

    public object GetObject(int rowIndex,int colIndeX)
    {
        switch(colIndeX)
        {
            case Object_column:
                return _objCol[rowIndex];
            default:
                throw new Exception("Incorrect column index specified.");
        }
    }
}

解决方法

这称为拳击,在性能和内存使用方面,成本实际上都很大.如果你想避免装箱,你想让一些简单的类型如int和double共享内存,使用LayoutKind struct layout attribute强制它们共享内存,然后将列表设置为该结构类型.例如:

[StructLayout(LayoutKind.Explicit)]
[CLSCompliant(false)]
public struct numberStackEntry
{
    /// <sumMary>Type of entry</sumMary>
    [FieldOffset(0)]
    public EntryTypes entryType;

    /// <sumMary>Value if Double</sumMary>
    [FieldOffset(4)]
    public double dval;

    /// <sumMary>Value if ulong</sumMary>
    [FieldOffset(4)]
    public ulong uval;

    /// <sumMary>Value if long</sumMary>
    [FieldOffset(4)]
    public long lval;

    /// <sumMary>Value if Integer</sumMary>
    [FieldOffset(4)]
    public int ival;
}

编辑:您可以创建上面的数组,而无需装箱以使用这些值填充数组成员.但是,您无法将数组添加到结构中,并使其与非CLI引用类型共享内存.

大佬总结

以上是大佬教程为你收集整理的c# – 将int(或任何值类型)作为对象存储并将它们转换回int(或值类型)是否有任何成本?全部内容,希望文章能够帮你解决c# – 将int(或任何值类型)作为对象存储并将它们转换回int(或值类型)是否有任何成本?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。