【问题标题】:Specific-Length Int Arrays in Class Object类对象中的特定长度 Int 数组
【发布时间】:2016-11-02 15:58:03
【问题描述】:

所以,这与我昨晚就同一代码部分提出的问题有关 - 问题本身不是重复的。

在以下代码中,DamageTypeArray 中的int[] 将始终是int[12]。有没有办法在类中指定它以确保它始终是我需要的长度?

public class DamageVehicle
{
    public int DVehicleID {get; set;}
}

public class DamageTypeArray
{
    public int[] DTypeArray {get; set;}
}

public class DamagePackage
{
    DamageVehicle dv;
    DamageTypeArray dta;
    DamagePackage dp;
}

对于具有DamagePackage 实例的对象,我可以这样引用它吗:

DamagePackage dp = new DamagePackage();

dp.dta[0] = 15;

dp.dta[1] = dp.dta[0] - 5;

如果没有,我可以使用什么方法以这种方式访问​​固定长度的数组?

【问题讨论】:

  • 使用集合代替。
  • 请改用List<T>。如果您确实需要强制执行大小约束,您可以编写一个继承自 List<T>FixedLengthList<T> 类,在其构造函数中获取大小,并在 Add、Remove、AddRange、RemoveAt 等上抛出异常。
  • 在类构造函数中初始化你的DTypeArray
  • 我喜欢收藏,但在这种情况下,它们并不能真正实现我想要完成的工作。我可以让它们工作,但它们也不能正常工作。最后,会有等同于每个位置的常量,所以我会调用dp.dta[TEST_CASE] 或类似的方法,如果将对象传递给另一个actor,这些常量有时会被修改。
  • @Pikoh - 我试图这样做,但有编译器异常。不能说我在工作时手头上有什么,但它根本不合适。

标签: c# arrays class


【解决方案1】:

你可以在类的构造函数中指定。将 setter 设为私有,以便可以将其从对象中更改出来。

public class DamageTypeArray
{
    public DamageTypeArray ()
    {
         DTypeArray = new int[12];
    }
    public int[] DTypeArray {get; private set;}
}

【讨论】:

    【解决方案2】:

    为了实现这一点,我会将支持字段标记为readonly 并将其初始化为您的数组,然后覆盖索引器。

    public class DamageTypeArray
    {
        private readonly int[] _dTypeArray = new int[12];
    
        public int this[int key]
        {
            get
            {
                return _dTypeArray[key]
            }
            set
            {
                _dTypeArray[key] = value;
            }
        }
    }
    

    在 getter 和 setter 中,您可以添加一些验证以在键超出范围时返回默认值,或者抛出比“IndexOutOfRangeException”更具体的异常。

    要使用它,只需像直接使用数组一样使用 DamageTypeArray。

    var damageArray = new DamageTypeArray();
    damageArray[10] = 99999;
    

    您也可以只为 auto 属性设置一个默认值。

    public int[] DTypeArray { get; set; } = new int[12];
    

    【讨论】:

    • 嗯,很有趣。我觉得我试过这个但它没有用,但现在我不太确定。谢谢!
    • 如果您尝试过并且遇到了特定异常,请在此处发布。有两件事可能出错了:1)您不能为静态字段设置默认值 2)如果您覆盖 getter 和 setter,则需要在支持字段而不是属性上设置默认值。
    【解决方案3】:

    使用数组长度的构造函数:

    public class DamageTypeArray
    {
        public int[] DTypeArray {get; set;}
        public DamageTypeArray()
        {
            DTypeArray = new int[12];
        }
    }  
    

    并像这样使用它dp.dta.DTypeArray[0] = 15;

    【讨论】:

    • 使代码的可读性降低了一点,但我想这并不完全糟糕。这可能有效。
    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多