Что плохого в параметрах ref? - PullRequest
14 голосов
/ 20 февраля 2009

Я столкнулся с ситуацией, которую, я думаю, можно решить только с помощью параметра ref. Однако это будет означать изменение метода, позволяющего всегда принимать параметр ref, когда мне нужна только функциональность, предоставляемая параметром ref, в 5% случаев.

Это заставляет меня думать: "Вау, сумасшедший, должен найти другой путь". Я глупый? Какие проблемы могут быть вызваны параметром ref?

Редактировать

Были запрошены дополнительные детали, я не думаю, что они полностью соответствуют тому, что я просил, но здесь мы идем.

Я хочу либо сохранить новый экземпляр (который будет обновляться с использованием идентификатора, который впоследствии можно будет использовать), либо извлечь существующий экземпляр, который соответствует некоторой логике, и обновить его, сохранить его и изменить ссылку на новый экземпляр на указать на существующий.

Код может прояснить ситуацию:

protected override void BeforeSave(Log entity)
{
    var newLog = entity;

    var existingLog = (from log in repository.All()
                           where log.Stuff == newLog.Stuff 
                                 && log.Id != newLog.Id
                           select log).SingleOrDefault();

    if (existingLog != null)
    {
        // update the time
        existingLog.SomeValue = entity.SomeValue;
        // remove the reference to the new entity
        entity = existingLog;
    }
}

// called from base class which usually does nothing before save
public void Save(TEntity entity)
{
    var report = validator.Validate(entity);

    if (report.ValidationPassed)
    {
        BeforeSave(entity);
        repository.Save(entity);
    }
    else
    {
        throw new ValidationException { Report = report };
    }
}

Тот факт, что я добавил бы его только для одного (пока) дочернего элемента базового класса, препятствует использованию перегрузки (из-за того, что мне пришлось бы дублировать метод Save). У меня также есть проблема, из-за которой мне нужно заставить их использовать версию ref в этом случае, иначе все будет работать не так, как ожидалось.

Ответы [ 12 ]

0 голосов
/ 20 февраля 2009

Это одна из тех вещей, которые F # или другие функциональные языки программирования решают намного лучше, возвращая значения Tuple. Это намного более чистый и лаконичный синтаксис. В книге, которую я читаю на F #, он фактически указывает на то, что C # равнозначно использует ref как то же самое в C # для возврата нескольких параметров.

Я понятия не имею, является ли это плохой практикой или есть какая-то базовая "буга-буга" в отношении параметров ref, для меня они просто не совсем понятны.

0 голосов
/ 20 февраля 2009

Если ваш метод нуждается только в этом параметре ref в 5% случаев, возможно, вам нужно сломать этот метод. Конечно, без подробностей сложно сказать, но это для меня пахнет как случай нарушения принципа единственной ответственности. Возможно, перегрузка поможет.

Что касается вашего вопроса, то, на мой взгляд, нет проблем с передачей параметра в качестве ссылки, хотя это не обычное дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...