Какими потребностями быть переопределенным в структуре для обеспечения равенства управляет правильно?

Зависит от того, что Вы делаете. Если Вы хотите иметь размеры, стена показывают время (количество фактического времени, который протек), Вы не можете стать намного лучше. Если Вы хотите иметь размеры, сколько времени компьютер делал что-то тогда, что Вы могли бы хотеть посмотреть times функция или time команда. Эти times функция в Perl возвращает список текущего накопленного времени для этого процесса в Вашем коде и коде любых модулей, которые Вы используете, этот процесс в системных вызовах, всех детях этого процесса в пользовательском коде и всех детях этого процесса в системных вызовах.

#!/usr/bin/perl

use strict;
use warnings;
use Time::HiRes;

my $start_time = [Time::HiRes::gettimeofday()];
.
.
.
my ($user, $system, $child_user, $child_system) = times;
print "wall clock time was ", Time::HiRes::tv_interval($start_time), "\n",
    "user time for $ was $user\n",
    "system time for $ was $system\n",
    "user time for all children was $child_user\n",
    "system time for all children was $child_system\n";

Эти time команда в UNIX подобна в функции. Вы выполняете команду как это

time ./script.pl

, и она производит что-то вроде этого

real    0m0.692s
user    0m0.019s
sys     0m0.109s

, где реальный стена, показывают время и пользователя, и sys совпадают с пользователем и системой выше.

Эти time команда легче для человека использовать, но эти times функция дает Вам больше информации и легче вписаться в компьютерную программу (плюс он, обладает преимуществом приведения к результатам, в то время как программа все еще работает).

, О, я забыл упоминать $^T. Эта переменная содержит время начала программы в секундах с эпохи, поэтому если Вы только заботитесь о гранулярности секунд, можно просто сказать

END { print "The program ran for ", time() - $^T, " seconds\n" }

близость верхняя часть программы.

71
задан Cœur 16 January 2017 в 15:57
поделиться

3 ответа

Пример из msdn

public struct Complex 
{
   double re, im;
   public override bool Equals(Object obj) 
   {
      return obj is Complex && this == (Complex)obj;
   }
   public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }
   public static bool operator ==(Complex x, Complex y) 
   {
      return x.re == y.re && x.im == y.im;
   }
   public static bool operator !=(Complex x, Complex y) 
   {
      return !(x == y);
   }
}
85
ответ дан 24 November 2019 в 12:58
поделиться

Вы также должны реализовать IEquatable . Вот выдержка из Руководства по проектированию инфраструктуры:

ОБЯЗАТЕЛЬНО реализуйте IEquatable для типов значений. Метод Object.Equals для типов значений вызывает бокс, и его реализация по умолчанию не очень эффективна, потому что в ней используется отражение. IEquatable.Equals может предложить гораздо лучшую производительность и может быть реализовано так, что это не вызывает бокса.

public struct Int32 : IEquatable<Int32> {
    public bool Equals(Int32 other){ ... }
}

НЕОБХОДИМО следовать тем же правилам, что и для переопределение Object.Equals, когда реализация IEquatable.Equals. См. Подробности в разделе 8.7.1. рекомендации по переопределению Object.Equals

44
ответ дан 24 November 2019 в 12:58
поделиться

Основное различие между ними состоит в том, что оператор == является статическим, т. Е. соответствующий метод для вызова определяется во время компиляции, а метод Equals вызывается динамически для экземпляра.
Возможно, лучше всего определить и то, и другое, даже если в случае структур это не так важно, поскольку структуры не могут быть расширены (структура не может наследовать от другой).

3
ответ дан 24 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: