Как я могу предотвратить копирование при возврате новой структуры? - PullRequest
3 голосов
/ 26 марта 2019

У меня есть структура, которая используется временным образом и выглядит примерно так:

internal readonly struct TrackingId
{
    public readonly string Source1;
    public readonly string Source2;
    public readonly string SourceN;

    // Computed from Source1..N
    public readonly string Value; 

    private TrackingId(string source1, string source2, string sourceN)
    {
        Source1 = source1;
        Source2 = source2;
        SourceN = sourceN;

        Value = String.Join("-", Source1, Source2, SourceN);
    }

    public static TrackingId Create(string source1, string source2, string sourceN)
    {
        return new TrackingId(source1, source2, sourceN);
    }
}

Фактический тип имеет много полей, поэтому выполнение копирования является очень нежелательным поведением.Тем не менее, я понимаю, что среда выполнения будет копировать новый экземпляр вызывающей стороне, если / пока он не решит встроить метод Create, который не гарантируется.

По сути, я ищу что-то подобноек разрешению копирования C ++, в котором возвращаемый объект создается на месте в хранилище вызывающего;есть ли способ надежно предотвратить копирование методом Create?

1 Ответ

2 голосов
/ 26 марта 2019

К сожалению, я думаю, что вы уже знаете ответ здесь.

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

Единственный способ сделать это - использовать ref return. Тем не менее, вы не можете вернуть ссылку значения типа , созданную локально. Следовательно, вы не можете смягчить защитную копию 1013 *.

Вы также исключили использование модификаторов ref / in / out, это также уменьшило бы защитную копию .

Итак, вы застряли и не можете достичь того, чего хотите.

  • Вам придется отказаться от методов типа Create, если вы не хотите копию
  • Или вам придется начать использовать языковые функции, которые позволяют передавать структуры по ссылке , используя readonly и / или in / ref / out модификаторы или ref return с нелокальными типами.

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

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