【问题标题】:Better way to express an array property表达数组属性的更好方法
【发布时间】:2014-04-24 21:17:28
【问题描述】:

考虑数组属性:

private object m_value;
public string[,] StringArray 
{
    get { return ValueToStrings(m_value); }
    set { m_value = StringsToValue(value); } 
}

当您尝试像这样使用该属性时,您会发现这是非常错误的:

StringArray[0, 0] = "2";
MessageBox.Show(StringArray[0, 0]);

因为数组是在每次访问时计算的,所以赋值只会影响非常短暂的数据,当您再次访问 StringArray[0, 0] 时,您会得到一个新的未更改的值。

如果让属性看起来像一个数组/矩阵,但实际上在设置单个元素时会影响底层数据,有什么更好的设计?

【问题讨论】:

  • 注意,这实际上并没有在实际代码中被滥用,但我正在清理和测试并发现了这个潜在的维护问题。
  • 你初始化m_value的对象是什么类型的? (大概是StringsToValue的返回类型)
  • 如果您忽略在ValueToStrings 中对数组执行的操作,那么为什么还要设置一个setter?似乎目的是每次都返回一个新数组。如果不是……好吧,那就不要创建新数组了。
  • 是的,实际代码中完全不需要setter,但是删除它并不能解决问题,它不会使数组元素成为只读。
  • m_value 是一种多态数据结构。转换的性质对问题并不重要,它是一个内部细节。

标签: c# arrays properties


【解决方案1】:

编写您自己的数组类,包含一个索引器访问器,并向其传递一个更新内部 m_value 的 Get/Set 委托,并且不存储它自己的 m_value 副本(实际上它什么也不存储)。让您现有的公共访问器返回您的数组类的实例,而不是动态生成数组。

【讨论】:

  • 合理。我考虑过某种封装类来处理数组和值。
猜你喜欢
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多