2016-09-15 4 views
1

Я делаю простую игру в единстве и имею небольшую непредставленность, которую вы могли бы мне помочь: Должен ли я назвать новый экземпляр класса? , например:C# Нужно ли указывать имя для экземпляра нового класса?

public class CreateCharacter : MonoBehaviour { 

public string charname; 

public CreateCharacter (string charname) 
{ 
    this.charname = charname; 
    //does all the stuff needed 
}} 

Я хочу, чтобы запустить это из другого сценария:

int e = data.Length - 1; 
      if (e > 0) 
      { 
       new CreateCharacter(data[e]); 
       e--; 
      } 

данных является массив строк и CreateCharacter будет хранить новый объект символов в списке таких объектов, так что я могу Освободите его позже. Мой вопрос: ли я написать:

CreateCharacter SomeName = new ChreateCharacter 

для кода для запуска? или просто

new Class (constructor) 

достаточно?

+1

Если вам не нужен экземпляр объекта, который был сконструирован и использован, то это поведение должно быть в статическом методе. – Servy

+0

Как мне поступить по этому статическому методу? – Bronsoner

+0

Если этот класс должен наследовать от MonoBehaviour: не используйте конструктор и 'new'. –

ответ

1

В то время как это плохая практика, чтобы что-то новое, а не бросать ее в переменную, этот код будет компилироваться и работать просто отлично. Кроме того, есть ли причина, по которой у вас есть класс под названием CreateCharacter? Вместо функции, которая возвращает фактический символ, учитывая данные?

+0

Я делаю каскад функций для создания объектов из списков - So Buildings инициализирует создание fo Символы, символы инициализируют другие вещи и т. Д. - все, всасывая данные из txt-файлов. Возможно, это не оптимально (я нооб), но помогает мне логически отслеживать происходящее. Если будет более простой способ сделать это, я буду рад узнать. – Bronsoner

+0

Я думаю, вам было бы лучше просто использовать каскад функций, описанных вами, но вы могли бы создать новое здание, которое могло бы создавать новые символы, которые могут быть хорошими, или, может быть, персонаж имеет статическую функцию, называемую CreateCharacter: Character.CreateCharacter (someData) Также каков формат этих текстовых файлов? Json? что-то другое? Вы можете использовать JSON и json.net для создания персонажа напрямую. –

+0

просто простой txt-файл - я использую разделитель символов для создания массива данных и чтения, поэтому я могу получить все необходимые данные для конструктора объектов символов. – Bronsoner

1

Это не приведет к смерти программы, не сохранив ее.

new CreateCharacter(data[e]);

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

CreateCharacter char = new CreateCharacter(string);

char.methodName();

Другой вариант это поставить код, который вы пытаетесь для выполнения в static method, потому что кажется, что код, который вы используете в конструкторе, не зависит от экземпляра класса CreateCharacter.

+0

Предпосылка вопроса состоит в том, что код, который ему нужен для запуска, находится в конструкторе (предположительно, он вызывает побочные эффекты), а не в других методах этого класса. Это, как правило, плохая практика, но, безусловно, выполнимая. – Servy

+0

@Servy Поскольку его класс называется 'CreateCharacter' для Unity, я на 99% уверен, что он хочет сохранить символ в переменной. –

+0

Ну, он довольно уверен, что ему ничего не нужно, так что, хотя может быть, что было бы лучше спроектировать класс так, чтобы это произошло, похоже, это не так с его нынешним дизайном , – Servy

1

Вы можете вызвать конструктор самостоятельно, как вы заявили. Однако имейте в виду, что вновь созданный объект немедленно выйдет из области действия и будет освобожден после завершения конструктора. Поэтому, в зависимости от того, что включено в «// делает все необходимое», это может привести к потере вашего приложения (хотя это будет маловероятно).

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

+0

Было бы очень сложно свернуть приложение в результате удаления объекта. Вероятно, для этого потребуется небезопасный код. Весь смысл иметь GC - это то, что он никогда не будет собирать все, на что можно ссылаться другим (управляемым) кодом. Также обратите внимание, что просто сохранить его в переменной, а затем никогда не использовать, ничего не изменит; GC разрешено видеть, что он не читается и не собирает его в любом случае. – Servy

+0

Позвольте мне добавить что-то: я хочу запустить CreateCharacter, который берет данные из файла (задается конструктором), создает новый объект Character, добавляет его в список символов, и я могу делать все с помощью этого объекта Character. Так это будет нормально работать? – Bronsoner

1

Если вы используете

новый класс (конструктор)

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

Смежные вопросы