【发布时间】: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