Как создать структуру для Span <byte> - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать Struct типа Span<byte>, но я получаю ошибку компилятора для этой строки:
public Span<byte> X { get; set; }

Там написано:
Поле или автоматически реализованное свойство не может иметь тип Span<byte>, если только он не является экземпляром члена структуры ref.

Я не уверен, что это означает или как я могу создать структура Span<byte>. Я знаю, что structs очень быстрые, поэтому я пытаюсь использовать вместе Span и Structs. Спасибо!

    public struct SpanStruct
    {
        public Span<byte> X { get; set; }
        public SpanStruct(Span<byte> x)
        {
            X = x;
        }
    }
    void function1()
    {
        var list = new SpanStruct[1000];
        for (int i = 0; i < 1000; i++)
        {
            Span<byte> span = new Span<byte>();
            list[i] = new SpanStruct(span);
        }
    }

Ответы [ 3 ]

2 голосов
/ 20 апреля 2020

Span - это специальный тип, предназначенный для использования в стеке. Вы не можете поместить его в class, потому что это может сделать то, на что он ссылается, не изжившим ссылку на кучу. Например, вы можете использовать Span для ссылки на то, что создано с помощью stackalloc.

Обычно Span используется только как локальная переменная для ссылки на часть данных самым абстрактным образом возможный. Существуют случаи, когда имеет смысл хранить их, но во многих из этих случаев Memory лучше, потому что, хотя это устраняет возможность ссылаться на такие вещи, как stackalloc, вы, вероятно, не захотите эту способность, если храните вещи в классы.

Если вам нужно создать struct, который содержит Span, обозначьте его public ref struct SpanStruct, но обратите внимание, что это означает, что его тоже нельзя вставить в class.

1 голос
/ 20 апреля 2020

Это язык, который ограничивает то, что мы не можем использовать его как поле или свойство, потому что Span<T> может жить только в стеке. Когда мы должны его использовать?

Он может использоваться только следующим образом:

  • Параметр метода
  • Тип возврата метода
  • A локальная переменная

См. post

Из документов Microsoft:

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

0 голосов
/ 20 апреля 2020

Span - это структура ref, которая размещается в стеке, а не в управляемой куче. Типы ref структуры имеют ряд ограничений, чтобы гарантировать, что они не могут быть перенесены в управляемую кучу, включая то, что они не могут быть упакованы, их нельзя назначать переменным типа Object, dynamici c или любому типу интерфейса , они не могут быть полями в ссылочном типе, и их нельзя использовать через await и давать границы. Кроме того, вызовы двух методов, Equals (Object) и GetHashCode, генерируют исключение NotSupportedException.

Это из документации Microsoft. Вы пытаетесь использовать Span<T> в качестве поля / свойства в ссылочном типе - class SpanStruct - что нарушает это.

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