c#通过属性返回数组

时间:2012-05-17 09:12:35

标签: arrays c#-4.0 properties

我想首先为看似愚蠢的问题道歉,但我对以下内容感到困惑。

我正在编写一个不会在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();        
    }    
}

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

如果您的关注点是指南CA1819: Properties should not return arrays,则 无论您是将Array公开为公共字段还是属性(在这里使readonly无关紧要)都是一样的。一旦暴露了原始阵列,就可以修改其内容。

为避免这种情况,如链接所示,将Field设为private,并从Getter返回Clone。 但是主要担心的是,如果多次检索,可能会有多个数组副本。它不利于性能和同步。

更好的解决方案是ReadOnlyCollection

使用ReadOnlyCollection,您可以将集合公开为只读,无法修改。此外,对基础馆藏的任何更改都将得到反映。