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

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

0 голосов
/ 22 октября 2018

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

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

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

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

Этот подход, очевидно, требует, чтобы класс, для которого вы создаете псевдонимы, был предварительно определен, поэтому я не знаю, соответствует ли он вашим потребностям.

После этих соображений яЯ бы сказал, что наилучшей практикой (и моим советом) было бы на самом деле объявлять классы и / или структуры в вашем коде для представления данных, которые вы используете.вместо того, чтобы пытаться подражать Свифту typealias.

0 голосов
/ 22 октября 2018

Если я не ошибаюсь, вам нужно что-то похожее на способность псевдонима значение кортежа .Кортежи значений являются недавним дополнением к 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;}
}
0 голосов
/ 22 октября 2018

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

public class Answer
{
   public string Title {get;set;}
   public bool IsCorrect {get;set;}
}

или struct для типа значения

public struct Question
{
  public string Question;
  public Answer[] Answers;
}

Также,в качестве FYI оператор с использованием используется с одноразовыми объектами, чтобы обеспечить высвобождение ресурсов.

...