等效于Swift Typealias的C#

时间:2018-10-22 01:07:01

标签: c# swift types

我是C#的新手,曾经使用过Swift,所以请多多包涵。

我想完全按照下面的Swift代码所描述的方式在C#中使用类型:

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语句并创建抽象类都无济于事。

谢谢。

4 个答案:

答案 0 :(得分:2)

我会使用class作为参考类型。

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

struct(用于值类型)

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

此外,作为仅供参考,using语句与一次性对象一起使用,以确保释放资源。

答案 1 :(得分:2)

我从未使用过Swift,但是看到您的示例代码,我能想到的最接近的想法是Anonymous Types。它们使您可以在声明变量并实例化其对象/值时构造新对象,而不必显式声明类/结构。示例:

var student = new
{
    Name = "John",
    LastName = "Doe",
    Age = 37,
    Hobbies = new [] { "Drinking", "Fishing", "Hiking" }
};

然后,您可以访问student.LastNamestudent.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的{{1} }。

答案 2 :(得分:1)

如果我没有误会,您想要类似于别名value tuples的功能。值元组是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 issue

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;}
}

答案 3 :(得分:0)

该线程很旧,但是我想添加一个简单的答案,因为现有的都不是。

C#与typealias的含义完全不同:

  • Swift中的typealias定义是持久的,可以在其他地方重用。

  • using定义仅保留在定义的文件中。它不能在项目的其他部分中使用。