C# Эквивалент Swift typealias

Я новичок в 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 и создавать абстрактные классы, но пока безрезультатно.

Заранее спасибо.

Чтобы уточнить, поскольку я не парень Swift, действительно ли приведенный выше код Swift создает тип, а не псевдоним существующего типа?

Llama 22.10.2018 03:38

Извините, я должен перефразировать свой вопрос; typealias не создает новый тип, он просто предоставляет новое имя для типа или их расположение.

HudsonGraeme 22.10.2018 03:46

Можете ли вы объяснить это: «расположение типов»?

Llama 22.10.2018 03:46

Вы можете найти ответы на этот (близкий, но не совсем повторяющийся) вопрос полезными stackoverflow.com/questions/9257989/defining-type-aliases

Ryan Leach 22.10.2018 03:48

@ Джон, я не знал, как это назвать; Я имел в виду typealias, подобные тем, которые указаны в вопросе, где есть несколько типов, назначенных одному псевдониму, например, первый typealias в вопросе содержит строку и значение типа bool, которые находятся в порядке; следовательно, typealiasAnswer на самом деле бывает двух типов. Снова извиняюсь за отсутствие ясности; нажмите здесь, чтобы получить профессиональное определение

HudsonGraeme 22.10.2018 04:00

@RyanTheLeach Я смотрел на это довольно долгое время, но не смог заставить его работать для меня

HudsonGraeme 22.10.2018 04:01

В итоге я использовал XML и собственный класс кнопок для достижения этой цели: исходный код здесь

HudsonGraeme 23.10.2018 20:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
2 010
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я бы использовал класс для ссылочных типов.

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

Llama 22.10.2018 03:36
Ответ принят как подходящий

Я никогда не работал со 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.

Я не уверен, что это так, это не может быть быстро возвращено из методов.

Ryan Leach 22.10.2018 04:38

Анонимно типизированные объекты могут быть возвращены с помощью возвращаемого типа dynamic, чтобы иметь доступ к его членам. Обратной стороной является то, что это полностью отключает проверку типов во время компиляции, которая может вызывать исключения времени выполнения, если кто-либо когда-либо пытается получить доступ к несуществующему члену возвращаемого объекта.

vinicius.ras 22.10.2018 04:46

Если я правильно понял, вам нужно что-то вроде возможности псевдонима кортежи значений. Кортежи значений являются недавним дополнением к 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 Не беспокойтесь :) Я думаю, что принятый ответ более полезен, по крайней мере, на данный момент. Я просто хотел добавить это для полноты картины.

Llama 22.10.2018 05:46

Эта ветка устарела, но я хотел бы добавить простой ответ, поскольку ни один из существующих.

C# не имеет точного эквивалента typealias:

  • Определение typealias в Swift является постоянным и может быть повторно использовано в другом месте.

  • Определение using сохраняется только в том файле, в котором оно определено. Его нельзя использовать в других частях проекта.

Другие вопросы по теме