我想首先为看似愚蠢的问题道歉,但我对以下内容感到困惑。
我正在编写一个不会在UI线程上运行的类库。在CL内部我需要一个数组,它将填充从存储过程调用接收的数据。然后,我需要通过事件将此数据传递回UI线程。
最初我打算写下以下内容。
public class ColumnInformation
{
public string[] columnHeaderNames;
public string[] columnDataTypes;
}
但我非常肯定会不满意而我应该使用属性。
public class ColumnInformation
{
public string[] columnHeaderNames {get; set;}
public string[] columnDataTypes {get; set;}
}
然后我遇到了以下情况。 MSDN
所以我认为我应该按照以下方式声明:
public class ColumnInformation
{
private string[] _columnHeaderNames;
public Names(string[] headerNames)
{
_columnHeaderNames = headerNames;
}
public string[] GetNames()
{
// Need to return a clone of the array so that consumers
// of this library cannot change its contents
return (string[])_columnHeaderNames.Clone();
}
}
感谢您的时间。
答案 0 :(得分:1)
如果您的关注点是指南CA1819: Properties should not return arrays,则 无论您是将Array公开为公共字段还是属性(在这里使readonly无关紧要)都是一样的。一旦暴露了原始阵列,就可以修改其内容。
为避免这种情况,如链接所示,将Field设为private,并从Getter返回Clone。 但是主要担心的是,如果多次检索,可能会有多个数组副本。它不利于性能和同步。
更好的解决方案是ReadOnlyCollection。
使用ReadOnlyCollection,您可以将集合公开为只读,无法修改。此外,对基础馆藏的任何更改都将得到反映。