#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 ...
)