C #: возможно ли, чтобы компилятор автоматически вызывал метод? - PullRequest
0 голосов
/ 10 октября 2019

В этом коде метод CompareTo () не вызывается явно, а max () дает правильный результат. Итак, мой вопрос: возможно ли, что CompareTo () вызывается неявно / auto-call? Если так, как я узнаю, какая другая функция / метод может быть вызвана неявно? Пожалуйста, помогите мне понять, спасибо! Результаты: Стив

public class Student : IComparable<Student> 
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int Age { get; set; }
    public int StandardID { get; set; }

    public int CompareTo(Student other)
    {
        if (this.StudentName.Length >= other.StudentName.Length)
        return 1;

        return 0;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Student collection
        IList<Student> studentList = new List<Student>>() { 
                new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
                new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 } ,
                new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
                new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} ,
                new Student() { StudentID = 5, StudentName = "Steve" , Age = 15 } 
            };
        var studentWithLongName = studentList.Max();

        Console.WriteLine("Student Name: {1}", studentWithLongName.StudentName);

    }
}

1 Ответ

1 голос
/ 10 октября 2019

Как уже говорил Джерун, вы вызываете метод IEnumerable.Max().

В основном то, что эта функция делает "в тени", выглядит примерно так:

private static T Max<T>(IEnumerable<T> source) where T : IComparable<T>
{
  if (source == null)
    throw new ArgumentNullException(nameof(source));

  bool isMaxSet = false;
  T max;
  foreach (T item in source)
  {
    if (isMaxSet == false)
    {
      max = item;
      isMaxSet = true;
    }
    else
    {
      if (max.CompareTo(item) < 0) // here's where it's used!
        max = item;
    }
  }

  if (isMaxSet == false)
    throw new InvalidOperationException();

  return max;
}

Кроме того, будьте осторожны, поскольку ваша int CompareTo(Student) функция неполна и ее использование может привести к непредвиденным результатам.

Как указано в https://docs.microsoft.com/en-us/dotnet/api/system.icomparable.compareto?view=netframework-4.8,, вот как она должна работать:

Меньше нуля: этот экземпляр предшествует obj в порядке сортировки.

Ноль: этот экземпляр находится в той же позиции в порядке сортировки, что и obj.

Больше нуля: этот экземпляр следуетobj в порядке сортировки.

...