Я потратил большую часть двух дней, пытаясь отследить ошибку, оказалось, что я случайно изменил значения, которые были предоставлены в качестве входных данных для функции.
IEnumerable<DataLog>
FilterIIR(
IEnumerable<DataLog> buffer
) {
double notFilter = 1.0 - FilterStrength;
var filteredVal = buffer.FirstOrDefault()?.oilTemp ?? 0.0;
foreach (var item in buffer)
{
filteredVal = (item.oilTemp * notFilter) + (filteredVal * FilterStrength);
/* Mistake here!
item.oilTemp = filteredValue;
yield return item;
*/
// Correct version!
yield return new DataLog()
{
oilTemp = (float)filteredVal,
ambTemp = item.ambTemp,
oilCond = item.oilCond,
logTime = item.logTime
};
}
}
Мое программирование предпочтительным языком обычно является C# или C ++, в зависимости от того, что, на мой взгляд, лучше соответствует требованиям (это часть более крупной программы, которая лучше подходит C#) ...
Теперь в C ++ я был бы возможность избежать такой ошибки, принимая постоянные итераторы, которые не позволяют вам изменять значения по мере их извлечения (хотя мне может понадобиться создать новый контейнер для возвращаемого значения). Я провел небольшой поиск и не могу найти простой способ сделать это в C#, кто-нибудь знает по-другому?
Я думал, что смогу создать класс IReadOnlyEnumerable<T>
, который займет IEnumerable
как конструктор, но потом я понял, что если он не сделает копию значений при их извлечении, это не будет иметь никакого эффекта, потому что базовое значение все еще можно изменить.
Есть ли способ Я мог бы быть в состоянии защитить от таких ошибок в будущем? Какой-нибудь класс-обертка, или даже если это небольшой фрагмент кода в верхней части каждой функции, которую я хочу защитить, все будет в порядке на самом деле.
Единственный разумный подход, о котором я могу подумать в данный момент, это ' Я буду работать над определением ReadOnly
версии каждого нужного мне класса, а затем иметь версию, не предназначенную только для чтения, которая наследует и перегружает свойства и добавляет функции для обеспечения изменяемой версии того же класса.