Прежде всего, ответы Джона, Майкла и Джареда по существу правильные, но у меня есть еще несколько вещей, которые я хотел бы добавить к ним.
Что подразумевается под "нечистым" методом?
Чистые методы легче охарактеризовать.«Чистый» метод имеет следующие характеристики:
- Его выход полностью определяется его входом;его вывод не зависит от внешних факторов, таких как время суток или биты на вашем жестком диске.Его вывод не зависит от его истории;повторный вызов метода с заданным аргументом должен дать тот же результат.
- Чистый метод не вызывает видимых мутаций в окружающем его мире.Чистый метод может решить изменить частное состояние ради эффективности, но чистый метод, скажем, не изменяет поле своего аргумента.
Например, Math.Cos
- это чистый метод.Его выход зависит только от его входа, и вход не изменяется при вызове.
Нечистый метод - это метод, который не является чистым.
Каковы некоторые из опасностейпрохождения только для чтения нечистых методов?
Есть два, которые приходят на ум.Первый - это тот, на который указывают Джон, Майкл и Джаред, и именно об этом вас предупреждает Решарпер.Когда вы вызываете метод в структуре, мы всегда передаем ссылку на переменную, которая является получателем, в случае, если метод хочет изменить переменную.
Так что, если вы вызываете такой метод для значения,а не переменная?В этом случае мы создаем временную переменную, копируем в нее значение и передаем ссылку на переменную.
Переменная только для чтения считается значением, поскольку ее нельзя преобразовать вне конструктора.Таким образом, мы копируем переменную в другую переменную, и нечистый метод, возможно, мутирует копию, когда вы намереваетесь изменить ее переменную.1031 *.Существует также опасность передачи структуры, содержащей поле только для чтения.Структура, которая содержит поле только для чтения, является обычной практикой, но по существу она выписывает чек на то, что система типов не имеет средств для наличных денег;«доступность только для чтения» конкретной переменной определяется владельцем хранилища.Экземпляр ссылочного типа «владеет» своим собственным хранилищем, а экземпляр типа значения - нет!
struct S
{
private readonly int x;
public S(int x) { this.x = x; }
public void Badness(ref S s)
{
Console.WriteLine(this.x);
s = new S(this.x + 1);
// This should be the same, right?
Console.WriteLine(this.x);
}
}
Кто-то думает, что this.x
не изменится, потому что x это поле только для чтения, а Badness
не является конструктором.Но ...
S s = new S(1);
s.Badness(ref s);
... ясно демонстрирует ложность этого.this
и s
относятся к одной и той же переменной, а , что переменная не доступна только для чтения!