Я изучаю контракты кода в .NET и пытаюсь понять идею чистых конструкторов. В коде договора документация говорится:
Все методы, которые вызываются в контракте, должны быть чистыми; то есть они не должны обновлять никакое ранее существующее состояние. Чистый метод позволяет изменять объекты, которые были созданы после входа в чистый метод.
И в PureAttribute
документации говорится:
Указывает, что тип или метод является чистым, то есть он не вносит видимых изменений состояния.
Я понимаю эти утверждения, когда речь идет о методах, но как насчет конструкторов? Предположим, у вас был такой класс:
public class Foo
{
public int Value { get; set; }
public Foo(int value) {
this.Value = value;
}
}
Этот конструктор, очевидно, влияет на состояние нового Foo
объекта, но у него нет других побочных эффектов (например, он не манипулирует ни одним из параметров и не вызывает какие-либо не чистые методы). Это кандидат на [Pure]
или нет? Каково значение размещения [Pure]
атрибута в конструкторе, и когда я должен сделать это в своем собственном коде?
[Pure]
атрибута и использовать его где-то еще в контракте, чтобы получить окончательный ответ.Объект не может быть использован, пока он не будет построен в этом случае. Поэтому конструктор чист. Если конструктор вызвал другой код или вызвал делегат, а другой код изменил изменяемое свойство, оно не было бы чистым. Чтобы быть безопаснее, лучше сделать собственность неизменной.
источник