Возможно ли создавать экземпляры объектов с именами переменных или получать доступ к именам переменных во время выполнения?

#c# #for-loop #runtime

#c# #для цикла #время выполнения

Вопрос:

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

 BackyardObject backyardObject0 = new BackyardObject(cat0, dog0, goat0, piglet0);
BackyardObject backyardObject1 = new BackyardObject(cat1, dog1, goat1, piglet1);
BackyardObject backyardObject2 = new BackyardObject(cat2, dog2, goat2, piglet2);
BackyardObject backyardObject3 = new BackyardObject(cat3, dog3, goat3, piglet3);
BackyardObject backyardObject4 = new BackyardObject(cat4, dog4, goat4, piglet4);
// many many more BackyardObjects being instantiated
  

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

Редактировать

Я думаю, что мне, возможно, не хватило деталей, которые были необходимы для получения правильного ответа на этот вопрос. Это не вопрос о том, «как» использовать цикл или как добавлять элементы в коллекцию, это скорее вопрос, чтобы определить, возможно ли динамически создавать «имя переменной» внутри цикла, одновременно получая доступ к другому имени переменной динамически внутри цикла при условии, чтоинформация, приведенная выше (просто составленный код на месте).

 // psuedo code for something I'm asking is possible
for( i = 0; i < 10; i  )
{
    // create BackyardObject with generic name, while appending "i" to 
    // variable name, and accessing other object variables
    BackyardObject backyardObject'i' 
        = new backyardObject(cat'i', dog'i', goat'i', piglet'i');
}
  

Хотя я понимаю, что мог бы создавать дополнительные массивы и списки для хранения объектов, а затем использовать их, я просто смотрел, можно ли динамически получать имена переменных. Я не был уверен, что это вполне возможно, поэтому я задал вопрос. Я знаю, что это странный вопрос, но мне стало любопытно после того, как я увидел этот код Objective-C.:

 // Getting an arrayName dynamically based on loop index
for (int i = 0; i < 10; i  )
{
    NSString *arrayName = [[NSString alloc] initWithFormat:@"column%d",
        i];
    NSArray *array = [self valueForKey:arrayName];
}
  

Комментарии:

1. Это называется массивом. Используйте это.

2. ДА. Важная часть этого вопроса заключается в том, как хранятся данные, а не в том, как вы создаете BackyardObjects . So… Как вы решаете catX , dogX , goatX , amp; pigletX ?

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

4. Я прошу прощения за то, что сначала не предоставил больше информации, но, пожалуйста, смотрите Редактирование вопроса выше. Это не то, как использовать цикл и т. Д.

Ответ №1:

У объектов нет имен… то, о чем вы говорите, — это переменные. И вместо того, чтобы иметь множество переменных с числами в качестве суффиксов, вам было бы лучше использовать коллекции — массивы, или списки, или что-то еще. Затем вы можете сделать:

 // Or use arrays...
List<Cat> cats = new List<Cat>();
cats.Add(new Cat(...)); // Add the cats however you want to set them up
// Ditto dogs, goats etc

List<BackyardObject> backyardObjects = new List<BackyardObject>();
for (int i = 0; i < 10; i  )
{
    backyardObjects.Add(new BackyardObject(cats[i], dogs[i],
                                           goats[i], piglets[i]));
}
  

Я предполагаю, что вы довольно новичок в C # — я предлагаю вам взглянуть на массивы и коллекции в том, что вы изучаете.

Комментарии:

1. в этом случае вам также понадобятся массивы / списки кошек, собак, коз и поросят, чтобы иметь ссылку на них и передавать их в const . класса.

2. Хотя я совсем не новичок в C #, я понимаю, что я мог бы создавать коллекции, такие как списки, массивы и тому подобное, как вы указали, и просто использовать очень простой цикл for . Я обновил свой вопрос и надеюсь, что это более понятно из того, что я прошу, возможно. Я предполагаю, что нет, но видел что-то в коде Objective-C в последнее время и задаюсь вопросом, есть ли что-то подобное в C #. Спасибо!

3. @HansGruber: Вы могли бы сделать это с помощью reflection — но это было бы совсем не идиоматично. Тот факт, что у вас есть эти переменные с числами в качестве суффикса, показывает, что вы уже думаете о них как о коллекции — так почему вы не использовали коллекцию? В чем преимущество наличия отдельных переменных? Динамическое использование имен, подобное этому, просто не является обычным способом C # решения проблемы, IMO.

4. @JonSkeet: Да, это был скорее вопрос, возможно ли это, мне было просто любопытно, увидев что-то в Objective-C, о чем я не знал, что это возможно при просмотре кода в книге. Каков наилучший способ решения этого вопроса, поскольку он не может быть удален, поскольку у него есть ответы? Очевидно, что это не очень полезный метод или тот, который, вероятно, будут использовать другие.

5. @HansGruber: Я не знаю об этом — это то, о чем часто спрашивают. Я не думаю, что это наносит значительный вред…