Эти «крутые» (но менее известные) вещи помогают сделать код быстрее; его легче читать и понимать.

Добро пожаловать во вторую часть статьи Amazing C#. Вы можете ознакомиться с частью 1 здесь.

1. Дополнительные параметры

Многие из вас не будут знать, что такое необязательные параметры (я это знаю из C++, но недавно узнал, что и в C# есть =)). Предполагая, что необязательных параметров нет, мы хотим запустить функции добавления следующим образом:

Add(1, 2);
Add(1, 2, 3.5);
Add(1, 2, 3.5, "Hello");
Add(1, 2, true);

Нам нужно перезаписать перегрузку функции Add 4 раза.

public int Add(int num1, int num2)
public int Add(int num1, int num2, double num3)
public int Add(int num1, int num2, double num3, string num4)
public int Add(int num1, int num2, bool bol)

Чрезвычайно раздражает и отнимает много времени, не так ли? С необязательными параметрами мы можем написать функцию, которая принимает все параметры и указывает один из параметров как необязательный. В противном случае будет использоваться значение по умолчанию:

public int Add (int num1, int num2,
                 double num3 = 0, string num4 = "", bool bol = true)
 
// Add statement (1, 2, true) ;, because skip num3 and num4, we will call
Add (1, 2, bol: false);
 
// The following 2 statements will be equivalent.
// When we do not pass num3, num4, they will use the default value
Add (1, 2);
Add (1, 2, 0, "", true);

Если вы выучили C++, это не имеет значения с этой концепцией. Как видите, это экономит нам много времени на кодирование.

2. Анонимный тип

Как упоминалось в части 1, анонимный тип полезен во многих случаях. Предположим, у нас есть 1 класс Student с 10 свойствами.

public class Student
 {
  public string Name { get; set; }
  public int Age { get; set; }
  public string Name2 { get; set; }
  public int Age2 { get; set; }
  public string Field1 { get; set; }
  public string Field2 { get; set; }
  public string Field3 { get; set; }
  public string Field4 { get; set; }
  public string Field5 { get; set; }
  public string Field6 { get; set; }
 }

Если мы хотим получить 2 поля, имя и возраст студента, чтобы для краткости сериализовать в JSON, мы пишем следующий код.

List <Student> students = new List <Student> ();
var stu = students.Select (st => new {Name = st.Name, Age = st.Age});
// Or more concisely
stu = students.Select (st => new {st.Name, st.Age});

Полученный объект Anonymous будет объектом с двумя свойствами: Name и Age. Этот объект также реализует функцию Equals(), так что мы можем легко сравнить эти 2 объекта. Однако нам также нужно быть осторожными с некоторыми случаями «равных, но не равных».

var a = new {Name = "Hoang", Age = 10};
var b = new {Name = "Hoang", Age = 10};
Console.WriteLine (a == b); // True
 
// Be careful of the following cases
var c = new {Name = "Hoang", Age = 10};
var d = new {Name = "Hoang", Age = 10.2};
var e = new {Age = 10, Name = "Hoang",};
Console.WriteLine (c == d); // No compile, error
Console.WriteLine (c == e); // No compile, error

3. Кортеж

Кортеж — довольно «странное» понятие; Я впервые встретил это понятие в Python, теперь знаю его в C#. Можно понять, что кортеж — это «сгусток» множества полей, похожий на класс, но определяемый быстрее и проще. Например:

var love = new Tuple<int>(1);
var lie = new Tuple<int, string>(1, "Why");
var lay = new Tuple<int, int, string>(1, 2, "Gay");
Console.WriteLine(lay.Item1 + " " + lay.Item2 + " " + lay.Item3);
// 1 2 Gay

Анонимный тип имеет один недостаток; то есть невозможно использовать анонимный тип в качестве возвращаемого типа или передавать параметры в функцию.

public ??? GetStu () // How to return
  {
    List <Student> students = new List <Student> ();
    var stu = students.Select (st => new {st.Name, st.Age});
    return stu;
  }
 
DoSomething (stu);
public void DoSomething (???); // How to pass in 

но с кортежем:

public List<Tuple<string, int>> GetStu()
 {
   List<Student> students = new List<Student>();
   var stu = students.Select(st => new Tuple<string, int>(st.Name, st.Age)).ToList();
   return stu;
 }
 
public void DoSomething( List<Tuple<string, int>> input);
DoSomething(stu);

Вы можете спросить: почему бы не создать новый класс? Почему вы используете анонимный тип с кортежем? Ответьте, пожалуйста:

  • В некоторых случаях нам нужно извлечь некоторые поля; если мы возьмем несколько полей создадим новый класс, то код будет достаточно избыточным и бессмысленным.
  • Если мы создадим новый класс, нам придется переопределить Equals и GetHashCode, если нам нужно сравнить. Анонимные типы и кортежи автоматически реализовали эту функцию за нас.

4. Стринги и малоизвестные вещи

Наверняка все мы использовали строки для рисования верхних и нижних колонтитулов?

Мы использовали код:

string header = "";
for (int i = 0; i <80; i ++)
  {
      header + = "";
  }
 
// The simpler way with string, you will be very surprised =))
string header = new string ('=', 80);

Точно так же, когда у нас есть список строк, мы хотим сложить все строки списка.

List <string> list = new List <string> {"1", "2", "3"};
  string result = "";
  foreach (var str in list)
  {
      result + = str + ",";
  }
 
// Incredibly simple second time
  string result = string.Join (",", list);
 
// More dominant when we join with non-string param
string result = string.Join (",", "Hello", 1, 2, 3.5); // Hello, 1, 2, 3.5

6. Инициализировать коллекцию (ToArray, ToList, ToDictionary, …)

При использовании Linq, после использования Where, Select, … возвращаемый результат обычно равен 1 IEnumerable, мы можем превратить их в список или массив с доступными функциями. ToList — наиболее часто используемая функция:

List <Student> students = new List <Student> ();
  IEnumerable <Student> stu = students.Where (st => st.Age> 0);
 
// Create list
  List <Student> stuList = stu.ToList ();
 
// Create array
  Student [] stuArray = stu.ToArray ();
 
  // Create a dictionary, Key is Name, Value is Age
  Dictionary <string, int> stuDic = stu.ToDictionary (t => t.Name, t => t.Age);

Статья - конец. Поскольку содержание статьи ограничено, в некоторых частях я представляю только обзор, не вдаваясь в подробности.

Такие части, как Linq, Anonymous Type, Delegate, … вы можете найти на моей личной странице. ».