0

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

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

谢谢你的时间。

4

1 回答 1

1

如果您关心的是指南CA1819: Properties should not return arrays
无论您将 Array 公开为 Public Field 还是 Property 都将是相同的(在这里设置 readonly 无关紧要)。一旦你的原始数组暴露出来,它的内容就可以被修改。

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

更好的解决方案是ReadOnlyCollection

使用 ReadOnlyCollection,您可以将集合公开为无法修改的只读。也将反映对基础集合的任何更改。

于 2012-05-17T09:27:56.557 回答