我是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
语句并创建抽象类都无济于事。
谢谢。
答案 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.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的{{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
定义仅保留在定义的文件中。它不能在项目的其他部分中使用。