Как избежать повторения в объявлениях, которые имеют внутренние разные символы

#c# #unity3d #declaration

#c# #unity-игровой движок #объявление

Вопрос:

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

  • Использование методов простое, я пытаюсь достичь этого только в объявлении класса.

Предположим, нам нужно объявить несколько Strings таким образом:

 String A = "You found a"   "Common"   "card";
String B = "You found a"   "Rare"   "card";
String C = "You found a"   "Legendary"   "card";
  

Итак, что я хочу иметь, так это объявление "You found a" и "card" только один раз и объявление A, B и C только с их внутренним переменным символом (при этом, конечно, имея повторяющиеся операторы и не используя никаких методов).

Я написал приведенный выше код как более простой пример, который может помочь мне достичь решения array подобным образом:

 AudioClip[] audioClips = 
{
    (AudioClip)Resources.Load("Audios/audio1.mp3", typeof(AudioClip)),
    (AudioClip)Resources.Load("Audios/audio2.mp3", typeof(AudioClip)),
    (AudioClip)Resources.Load("Audios/audio3.mp3", typeof(AudioClip)),
};

// This is Unity by the way, just a sample
  

Как вы можете видеть, у нас есть входные данные массива с одной строкой кода, внутри которых есть только один символ переменной Strings .

Итак, есть ли какой-нибудь способ создать что-то подобное:

 //Imaginary code:

String A = /* You found a */ "common" /* card */'
String B = /* You found a */ "Rare" /* card */;
String C = /* You found a */ "Legendary" /* card */;
  

и во втором:

 AudioClip[] audioClips = 
{
    /* (AudioClip)Resources.Load("Audios/audio */ 1 /* .mp3", typeof(AudioClip)) */,
    /* (AudioClip)Resources.Load("Audios/audio */ 2 /* .mp3", typeof(AudioClip)) */,
    /* (AudioClip)Resources.Load("Audios/audio */ 1 /* .mp3", typeof(AudioClip)) */,
};

// The commented statements with /*, */ are what need to be there 
// without being written multiple times in each.
  

Итак, есть ли решение? Я сказал, что не использую никаких методов, но если это достижимо только с помощью методов, как это сделать в AudioClip array .

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

1. So what I want to have is declaring the "You found a" and "card" only once Погуглите, что const делает.

2. Используйте const string FoundCardType = "You found a {0} card"; , тогда вы можете использовать это как: var cardType = "common"; var message = string.Format(FoundCardType, cardType);

3. Почему бы не использовать методы? В C # нет макросов, как в C и других языках.

4. наложение любого типа ограничений на ответ, например, без использования каких-либо методов , на самом деле может снизить производительность. Вы не хотите пытаться перехитрить компилятор (c # или JIT), они чрезвычайно умны и не являются встроенными функциями онлайн, но также удаляют полные блоки кода, если считается, что он никогда не использовался (да, JIT сделает это).

Ответ №1:

Вы можете использовать const строку с заполнителями для значений, которые хотите заменить, а затем использовать string.Format для выполнения замены, когда вам это нужно, например:

 const string FoundCardMessage = "You found a {0} card";

private static void Main(string[] args)
{
    var cardTypes = new List<string> {"Common", "Rare", "Legendary"};

    foreach (var cardType in cardTypes)
    {
        var message = string.Format(FoundCardMessage, cardType);
        Console.WriteLine(message);
    }
}
  

Вывод

введите описание изображения здесь

Ответ №2:

Считается ли это «использованием методов»?

 AudioClip[] audioClips = 
    Enumerable.Range(1,3)
              .Select( i => (AudioClip)Resources.Load("Audios/audio"   i   ".mp3", typeof(AudioClip)))
              .ToArray();
  

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

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

1. Не используя методы, я имел в виду не помещать объявление в void Main или любой другой метод, это было именно то, что я искал. Спасибо

2. Могу ли я использовать i как string , а не числовое значение?

3. @Sorena Ну, я полагаю, вы могли бы использовать (new [] {"1", "2", "3"}).Select(... вместо этого. Что плохого в использовании чисел?

4. Спасибо. В случае, если переменная не является числом, (например audioOne, audioTwo ... )