Использование параметра ref - хорошее дизайнерское решение? - PullRequest
0 голосов
/ 07 марта 2012

В контексте c # я немного застрял в конфликте по поводу использования параметров ref / out? Увеличивает ли использование таких параметров сцепление используемых мной методов или компонентов?

У меня нет явного примера прямо сейчас. Мне просто интересно узнать, является ли это хорошим дизайном программного обеспечения для использования этих конструкций.

ИМХО, результат метода должен быть возвращен через возвращаемое значение метода.

Каково ваше мнение? Эта тема является скорее темой дизайна, чем технической.

Ответы [ 4 ]

1 голос
/ 07 марта 2012

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

Поскольку вы не знаете, что функция делает для этого объекта.

Функцииследует отделить, чтобы действительно определить свою роль.

1 голос
/ 07 марта 2012

Это на самом деле не имеет ничего общего со связью. Это стиль кодирования. Лично мне не нравятся параметры ref / _ out_, особенно когда они используются для возврата нескольких значений из вызова функции. Я предпочитаю создавать собственный класс, который упаковывает предполагаемые возвращаемые значения, а не возвращать несколько из параметров.

0 голосов
/ 07 марта 2012

В некоторых ситуациях полезно иметь оба модификатора.Я просто хочу привести несколько примеров.

out

Словарь - хороший пример использования параметра out.Если вы хотите узнать, содержит ли словарь ключ, и хотите получить значение, если ключ существует, вы делаете это следующим образом:

MyType result;
if (myDictionary.TryGetValue(myKey, out result))
{
    // Use result
}

Если вы не можете использовать параметр out, вам придетсязапишите это так:

Dictionary<KeyType, MyType> myDictionary = ...;
if (myDictionary.ContainsKey(myKey))
{
    MyType result = myDicionary[myKey];
}

Это приведет к снижению производительности, поскольку словарь должен искать ключ два раза.Другая возможность могла бы быть такой:

Dictionary<KeyType, MyType> myDictionary = ...;
Dictionary<KeyType, MyType>.TryGetResult result = myDictionary.TryGetValue(myKey);

if (result.Succeeds)
{
    MyType resultValue = result.Value;
}

, которая полезна, но, на мой взгляд, не так хороша, как выходное решение, потому что вам нужно создать дополнительную структуру или класс для результата и, конечно,код также не так чист.

ref

Ссылка полезна, когда необходимо изменить существующий объект вне вызываемого метода.

MyObject myvar = myStream.ReadMyObject();
if (dataProcessor.Process(ref myvar)) {.... }


// Data processor....
public Boolean Process(ref MyObject myvar)
{
    if (!myvar.IsClean)
    {
        myvar = new MyObject(); // Create clean object
        return false;
    }
    return true;
}
0 голосов
/ 07 марта 2012

Что если вам нужно вернуть более 1 значения? Если возвращаемое значение обозначает успех / неудачу и вам также необходимо вернуть определенные вычисленные / обработанные значения?

Например, параметры ref требуются, когда метод должен переназначить ссылочный тип.

Использование будет в большей степени зависеть от конкретного рассматриваемого варианта использования.

...