Инициализация массива структур в C#

Предупреждение: невозможно изменить информацию заголовка - уже отправленные заголовки

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

Это E_WARNING , и он не остановит сценарий.

Типичным примером может быть файл шаблона, подобный этому:


    
    My Page

...

Функция session_start() попытается отправить клиенту файлы cookie сеанса. Но PHP уже отправил заголовки, когда он написал элемент в выходной поток. Вам нужно будет переместить session_start() в верхнюю часть.

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

Часто пропускаемый вывод - это новые строки после закрытия PHP ?>. Считается стандартной практикой опускать ?>, когда это последняя вещь в файле. Аналогичным образом, еще одной распространенной причиной этого предупреждения является то, что перед открытием перед ним появляется пустое пространство, строка или невидимый символ, в результате чего веб-сервер отправляет заголовки и пробел / новую строку, таким образом, когда PHP начинает синтаксический анализ, он не сможет для отправки любого заголовка.

Если в вашем файле содержится более одного кодового блока , у вас не должно быть пробелов между ними. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически сконструирован)

Также убедитесь, что в вашем коде не указаны знаки байтового заказа, например, когда кодировка скрипта является UTF -8 с BOM.

Вопросы, относящиеся

43
задан Adam Tegen 23 February 2017 в 17:52
поделиться

4 ответа

Во-первых, у Вас действительно должна быть изменяемая структура? Они - почти всегда плохая идея. Аналогично общедоступные поля. Существуют некоторые очень случайные контексты, в которых они разумны (обычно обе части вместе, как с ValueTuple), но они довольно редки, по моему опыту.

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

class SomeClass
{

    struct MyStruct
    {
        private readonly string label;
        private readonly int id;

        public MyStruct (string label, int id)
        {
            this.label = label;
            this.id = id;
        }

        public string Label { get { return label; } }
        public string Id { get { return id; } }

    }

    static readonly IList<MyStruct> MyArray = new ReadOnlyCollection<MyStruct>
        (new[] {
             new MyStruct ("a", 1),
             new MyStruct ("b", 5),
             new MyStruct ("q", 29)
        });
}

Примечание использование ReadOnlyCollection вместо того, чтобы представить сам массив - это сделает его неизменным, избегая проблема, представляющая массивы непосредственно . (Шоу кода действительно инициализирует массив структур - оно тогда просто передает ссылку на конструктора ReadOnlyCollection<> лет.)

51
ответ дан Jon Skeet 26 November 2019 в 22:53
поделиться

Вы используете C# 3.0? Можно использовать объектные инициализаторы как так:

static MyStruct[] myArray = 
            new MyStruct[]{
                new MyStruct() { id = 1, label = "1" },
                new MyStruct() { id = 2, label = "2" },
                new MyStruct() { id = 3, label = "3" }
            };
25
ответ дан Winston Smith 26 November 2019 в 22:53
поделиться

Вы не можете инициализировать ссылочные типы по умолчанию кроме пустого указателя. Необходимо сделать их только для чтения. Таким образом, это могло работать;

    readonly MyStruct[] MyArray = new MyStruct[]{
      new MyStruct{ label = "a", id = 1},
      new MyStruct{ label = "b", id = 5},
      new MyStruct{ label = "c", id = 1}
    };
4
ответ дан Ali Ersöz 26 November 2019 в 22:53
поделиться

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

public class SomeClass
{
   public readonly MyStruct[] myArray;

   public static SomeClass()
   {
      myArray = { {"foo", "bar"},
                  {"boo", "far"}};
   }
}
-2
ответ дан Paul Sonier 26 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: