CA1819: プロパティは、配列を返すことはできません
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
カテゴリ |
Microsoft.Performance |
互換性に影響する変更点 |
あり |
原因
パブリック型のパブリック プロパティまたはプロテクト プロパティで、配列を返しています。
規則の説明
プロパティが読み取り専用であっても、プロパティで返される配列は書き込みから保護されません。 配列の改ざんを防ぐには、プロパティで配列のコピーを返す必要があります。 一般に、このようなプロパティを呼び出すときのパフォーマンス低下は理解されません。 具体的には、インデックス付きプロパティとして、プロパティを使用する場合があります。
違反の修正方法
この規則違反を修正するには、プロパティをメソッドにするか、またはコレクションを返すようにプロパティを変更します。
警告を抑制する状況
属性には、配列を返すプロパティを含めることはできますが、コレクションを返すプロパティを含めることはできません。 [System.Attribute] クラスから派生した属性のプロパティに対して発生した警告を抑制できます。 それ以外の場合、この規則による警告は抑制しないでください。
違反例
説明
この規則に違反するプロパティを次の例に示します。
コード
Imports System
Namespace PerformanceLibrary
Public Class Book
Private _Pages As String()
Public Sub New(ByVal pages As String())
_Pages = pages
End Sub
Public ReadOnly Property Pages() As String()
Get
Return _Pages
End Get
End Property
End Class
End Namespace
using System;
namespace PerformanceLibrary
{
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] Pages
{
get { return _Pages; }
}
}
}
説明
この規則違反を修正するには、プロパティをメソッドにするか、または配列ではなくコレクションを返すようにプロパティを変更します。
プロパティをメソッドに変更する例
説明
プロパティをメソッドに変更することによって上記の違反を修正するコード例を次に示します。
コード
Imports System
Namespace PerformanceLibrary
Public Class Book
Private _Pages As String()
Public Sub New(ByVal pages As String())
_Pages = pages
End Sub
Public Function GetPages() As String()
' Need to return a clone of the array so that consumers
' of this library cannot change its contents
Return DirectCast(_Pages.Clone(), String())
End Function
End Class
End Namespace
using System;
namespace PerformanceLibrary
{
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] GetPages()
{
// Need to return a clone of the array so that consumers
// of this library cannot change its contents
return (string[])_Pages.Clone();
}
}
}
コレクションを返す例
説明
以下のコレクションを返すようにプロパティを変更することによって上記の違反を修正するコード例を次に示します。
ReadOnlyCollection.
コード
Imports System
Imports System.Collections.ObjectModel
Namespace PerformanceLibrary
Public Class Book
Private _Pages As ReadOnlyCollection(Of String)
Public Sub New(ByVal pages As String())
_Pages = New ReadOnlyCollection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As ReadOnlyCollection(Of String)
Get
Return _Pages
End Get
End Property
End Class
End Namespace
using System;
using System.Collections.ObjectModel;
namespace PerformanceLibrary
{
public class Book
{
private ReadOnlyCollection<string> _Pages;
public Book(string[] pages)
{
_Pages = new ReadOnlyCollection<string>(pages);
}
public ReadOnlyCollection<string> Pages
{
get { return _Pages; }
}
}
}
ユーザーによるプロパティの修正を許可する
説明
クラスのコンシューマーがプロパティを修正できるように設定できます。 この規則に違反する読み取り/書き込みプロパティを次の例に示します。
コード
Imports System
Namespace PerformanceLibrary
Public Class Book
Private _Pages As String()
Public Sub New(ByVal pages As String())
_Pages = pages
End Sub
Public Property Pages() As String()
Get
Return _Pages
End Get
Set(ByVal value as String())
_Pages = value
End Set
End Property
End Class
End Namespace
using System;
namespace PerformanceLibrary
{
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] Pages
{
get { return _Pages; }
set { _Pages = value; }
}
}
}
説明
Collection を返すようにプロパティを変更することによって上記の違反を修正するコード例を次に示します。
コード
Imports System
Imports System.Collections.ObjectModel
Namespace PerformanceLibrary
Public Class Book
Private _Pages As Collection(Of String)
Public Sub New(ByVal pages As String())
_Pages = New Collection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As Collection(Of String)
Get
Return _Pages
End Get
End Property
End Class
End Namespace
using System;
using System.Collections.ObjectModel;
namespace PerformanceLibrary
{
public class Book
{
private Collection<string> _Pages;
public Book(string[] pages)
{
_Pages = new Collection<string>(pages);
}
public Collection<string> Pages
{
get { return _Pages; }
}
}
}