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である場合、
配列をパブリック フィールドとして公開するか、プロパティとして公開するかは同じです (ここでは読み取り専用にすることは重要ではありません)。元の配列が公開されると、その内容を変更できます。

これを回避するには、リンクが示唆するように、Field を非公開にし、Getter から Clone を返します。ただし、主な懸念事項は、何度も取得すると、配列の複数のコピーが存在する可能性があることです。パフォーマンスと同期には適していません。

より良い解決策はReadOnlyCollectionです。

ReadOnlyCollection を使用すると、コレクションを変更できない読み取り専用として公開できます。また、基になるコレクションへの変更も反映されます。

于 2012-05-17T09:27:56.557 に答える