Почему я должен Инициализировать Все Поля в своей структуре C# с Конструктором Не по умолчанию?

Не уверен, правильно ли я понимаю ваш вопрос ... Вот базовая конфигурация build.gradle, которая генерирует файлы Java из WSDL в нужном каталоге, компилирует эти файлы Java и добавляет скомпилированные классы в файл jar по умолчанию, созданный для проекта Java - все просто запустив ./gradlew jar:

buildscript{
    repositories{
        jcenter()
    }
    dependencies {
        classpath 'no.nils:wsdl2java:0.10'
    }
}

apply plugin: 'no.nils.wsdl2java'
apply plugin: 'java'

repositories{
    jcenter()
}

wsdl2java {
    generatedWsdlDir = file('src/main/generated')
    wsdlsToGenerate = [
        ['src/main/resources/yourWsdlFile1.wsdl'],
        ['src/main/resources/yourWsdlFile2.wsdl']
    ]
}

Сгенерированный файл JAR находится в build/libs/yourProjectName.jar (в каталоге вашего проекта Gradle).

12
задан John Saunders 25 April 2009 в 14:32
поделиться

6 ответов

Типы значений создаются в стеке (если они не вложены в ссылочный тип) В полях / расположениях стека есть что-то, что CLR не может гарантировать, что они будут обнулены (наоборот) к полям / расположениям в управляемой куче, которые гарантированно обнуляются). Следовательно, они должны быть записаны до того, как их прочитают. В противном случае это дыра в безопасности.

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

new BimonthlyPairStruct()

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

Смотрите также: CLR через C # 2nd Ed - Pg 188

10
ответ дан 2 December 2019 в 05:55
поделиться

Это вызвано тем, что структуры получены из Системы. ValueType и не Система. Объект, Система. ValueType реализует значение по умолчанию constructur, который Вы не можете переопределить, этот конструктор по умолчанию инициализирует все поля в структуре с его значением по умолчанию. Таким образом, при реализации какого-либо конструктора параметра в классе, Вам также будет нужен t0, гарантируют, чтобы Вы вызвали систему. Константа значения по умолчанию ValueType. И ответить, почему требуется к init все свое значение, которое это вызвано тем, что значение хранится в стековой памяти.

5
ответ дан 2 December 2019 в 05:55
поделиться

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

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

При определении инициализатора не по умолчанию C# требует, чтобы Вы установили все поля, потому что он пропускает обнуление памяти и позволяет Вам инициализировать его - иначе у Вас должен был бы быть двойной хит выполнения инициализации. Если Вы не заботитесь о (очень небольшом) хите производительности, можно всегда объединять вызов в цепочку к: это () инициализатор и затем только инициализирует выбранные поля.

5
ответ дан 2 December 2019 в 05:55
поделиться

Это работает:

  public Direction(int azimuth)
  {
    _azimuth = azimuth;
  }

От спецификации:

Конструкторы Struct вызываются с новым оператором, но это не подразумевает, что память выделяется. Вместо того, чтобы динамично выделить объект и возвратить ссылку на него, конструктор структуры просто возвращает само значение структуры (обычно во временном месте на стеке), и это значение затем копируется по мере необходимости.

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

5
ответ дан 2 December 2019 в 05:55
поделиться

Необходимо инициализировать поле, а не через свойство.

-1
ответ дан 2 December 2019 в 05:55
поделиться
public struct Direction
{
    public int Azimuth { get; private set; }

    public Direction(int azimuth) : this()
    {
        Azimuth = azimuth;
    }
}
2
ответ дан 2 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

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