Я новичок в C# и привык к Swift, так что терпите меня.
Я хотел бы использовать типы в C# точно так, как описано в приведенном ниже коде Swift:
typealias Answer = (title: String, isCorrect: Bool)
typealias Question = (Question: String, Answers: [Answer])
Для дальнейшего примера, теперь очень просто сделать Question быстро, используя приведенные выше typealias:
Question(Question: "What is this question?", Answers: [("A typedef", false), ("FooBar", false), ("I don't know", false), ("A Question!", true)])
Я пробовал использовать операторы using и создавать абстрактные классы, но пока безрезультатно.
Заранее спасибо.
Извините, я должен перефразировать свой вопрос; typealias не создает новый тип, он просто предоставляет новое имя для типа или их расположение.
Можете ли вы объяснить это: «расположение типов»?
Вы можете найти ответы на этот (близкий, но не совсем повторяющийся) вопрос полезными stackoverflow.com/questions/9257989/defining-type-aliases
@ Джон, я не знал, как это назвать; Я имел в виду typealias, подобные тем, которые указаны в вопросе, где есть несколько типов, назначенных одному псевдониму, например, первый typealias в вопросе содержит строку и значение типа bool, которые находятся в порядке; следовательно, typealiasAnswer на самом деле бывает двух типов. Снова извиняюсь за отсутствие ясности; нажмите здесь, чтобы получить профессиональное определение
@RyanTheLeach Я смотрел на это довольно долгое время, но не смог заставить его работать для меня
В итоге я использовал XML и собственный класс кнопок для достижения этой цели: исходный код здесь





Я бы использовал класс для ссылочных типов.
public class Answer
{
public string Title {get;set;}
public bool IsCorrect {get;set;}
}
или структура для типа значения
public struct Question
{
public string Question;
public Answer[] Answers;
}
Кроме того, в качестве FYI оператор с использованием используется с одноразовыми объектами, чтобы гарантировать высвобождение ресурсов.
К вашему сведению, это не всеusing в разных контекстах. Я скорее думаю, что OP имел в виду, что они пробовали что-то вроде using ABC = String; (что полностью соответствует C# и создаст псевдоним String под названием ABC).
Я никогда не работал со Swift, но, увидев ваш пример кода, самое близкое, что я могу вспомнить, - это Анонимные типы. Они позволяют вам структурировать новый объект при объявлении переменной и создании экземпляра ее объекта / значения без необходимости явно объявлять класс / структуру. Пример:
var student = new
{
Name = "John",
LastName = "Doe",
Age = 37,
Hobbies = new [] { "Drinking", "Fishing", "Hiking" }
};
Затем вы можете получить доступ к полям как student.LastName, student.Age и так далее. Типы свойств внутри анонимного типа передаются компилятором (но вы можете использовать приведение типов, если хотите принудительно использовать определенные типы для некоторого свойства).
Ваш пример можно смоделировать примерно так:
var answersArray = new[] {
new { Title = "First answer", IsCorrect = false },
new { Title = "Second answer", IsCorrect = true },
new { Title = "Third answer", IsCorrect = false },
new { Title = "Fourth answer", IsCorrect = false },
};
var questionData = new { Question = "To be or not to be?", Answers = answersArray };
И доступ к данным будет осуществляться каким-то образом, например:
Console.WriteLine(questionData.Question);
foreach (var answer in answersArray)
Console.WriteLine(answer.Title);
Проблема с анонимными типами заключается в том, что созданные объекты - это только чтение, поэтому значения, полученные свойствами анонимно типизированного объекта, не могут измениться после создания экземпляра объекта.
Ключевое слово using можно использовать в случаях, когда у вас уже есть определенный класс и вы хотите указать псевдоним для этого класса, например:
// The "HttpClient" class will now have an alias of "MyClient"
using MyClient = System.Net.Http.HttpClient;
Этот подход, очевидно, требует, чтобы класс, который вы назначаете псевдонимом, был предварительно определен, поэтому я не знаю, соответствует ли он вашим потребностям.
После этих соображений я бы сказал, что лучшей практикой (и моим советом) было бы фактически объявить классы и / или структуры в вашем коде для представления данных, которые вы используете, вместо того, чтобы пытаться имитировать Swift typealias.
Я не уверен, что это так, это не может быть быстро возвращено из методов.
Анонимно типизированные объекты могут быть возвращены с помощью возвращаемого типа dynamic, чтобы иметь доступ к его членам. Обратной стороной является то, что это полностью отключает проверку типов во время компиляции, которая может вызывать исключения времени выполнения, если кто-либо когда-либо пытается получить доступ к несуществующему члену возвращаемого объекта.
Если я правильно понял, вам нужно что-то вроде возможности псевдонима кортежи значений. Кортежи значений являются недавним дополнением к C# и позволяют создавать объекты (при поддержке ValueTuple<T,T,T,T>) без определения полных классов. Например:
public (string Name, int Age) GetPerson()
{
return (Name: "John", Age: 30);
}
var john = GetPerson();
Console.WriteLine(john.Age); // 30
В настоящее время в C# можно использовать псевдонимы для типов (см. Ниже), но это пока невозможно с кортежами значений. Для него есть открытый Проблема с GitHub.
using Abc = String;
Abc test = "hello";
Тем временем, вероятно, лучше всего создать классы для представления ваших данных (за исключением некоторых ситуаций, когда достаточно анонимных типов, см. Ответ vinicius.ras), например:
public class Answer
{
public string Title {get;set;}
public bool IsCorrect {get;set;}
}
public class Question
{
public string QuestionText {get;set;}
public IList<Answer> Answers {get;set;}
}
@Spencer Не беспокойтесь :) Я думаю, что принятый ответ более полезен, по крайней мере, на данный момент. Я просто хотел добавить это для полноты картины.
Эта ветка устарела, но я хотел бы добавить простой ответ, поскольку ни один из существующих.
C# не имеет точного эквивалента typealias:
Определение typealias в Swift является постоянным и может быть повторно использовано в другом месте.
Определение using сохраняется только в том файле, в котором оно определено. Его нельзя использовать в других частях проекта.
Чтобы уточнить, поскольку я не парень Swift, действительно ли приведенный выше код Swift создает тип, а не псевдоним существующего типа?