62 lines
1.4 KiB
Plaintext
62 lines
1.4 KiB
Plaintext
A writable collection property can be replaced by a completely different collection. Making it ``++readonly++`` prevents that while still allowing individual members to be set. If you want to allow the replacement of the whole collection the recommended pattern is to implement a method to remove all the elements (e.g. ``++System.Collections.List<T>.Clear++``) and a method to populate the collection (e.g. ``++System.Collections.List<T>.AddRange++``).
|
||
|
||
|
||
This rule raises an issue when an externally visible writable property is of a type that implements ``++System.Collections.ICollection++`` or ``++System.Collections.Generic.ICollection<T>++``.
|
||
|
||
|
||
== Noncompliant Code Example
|
||
|
||
----
|
||
using System;
|
||
using System.Collections;
|
||
|
||
namespace MyLibrary
|
||
{
|
||
public class Foo
|
||
{
|
||
List<string> strings;
|
||
|
||
public List<string> SomeStrings
|
||
{
|
||
get { return strings; }
|
||
set { strings = value; } // Noncompliant
|
||
}
|
||
}
|
||
}
|
||
----
|
||
|
||
|
||
== Compliant Solution
|
||
|
||
----
|
||
using System;
|
||
using System.Collections;
|
||
|
||
namespace MyLibrary
|
||
{
|
||
public class Foo
|
||
{
|
||
List<string> strings;
|
||
|
||
public readonly List<string> SomeStrings
|
||
{
|
||
get { return strings; }
|
||
}
|
||
}
|
||
}
|
||
----
|
||
|
||
|
||
== Exceptions
|
||
|
||
This rule does not raise issues for
|
||
|
||
* ``++string++``, ``++Array++`` and ``++PermissionSet,++``
|
||
* properties marked as ``++DataMemberAttribute++``
|
||
* classes marked as ``++Serializable++``
|
||
* properties overriding a base class member
|
||
* properties implementing interface
|
||
|
||
|
||
|