@ Гидеон - рад, что кто-то это указал. Вот простой тест, который показывает драматическое влияние AndAlso:
Dim tm As New Stopwatch
Const tries As Integer = 123456
Dim z As Integer = 0
Dim s() As String = New String() {"0", "one"}
Debug.WriteLine("AndAlso")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
Debug.WriteLine("And")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
Это не примитивное значение, поэтому его конструктор и / или деструктор могут иметь желаемые побочные эффекты.
Чтобы проиллюстрировать это, это происходит на практике: я использую класс для временных разделов кода, который выглядит примерно так:
class Timed {
double start;
public:
Timed() { start = now(); }
~Timed() { std::cout << (now() - start) << '\n'; }
}
Итак, чтобы измерить, сколько времени занимает функция, я просто делаю:
void slow() {
Timed t;
// heavy operation here...
}
Переменная t
никогда не используется, но она по-прежнему важна к поведению кода.
Потому что вы могли бы сделать это с определенной целью. Это не примитив. Может быть, конструктор и деструктор делают что-то важное?
У MFC даже были классы, которые работали таким образом, вы могли бы сделать это:
void foo()
{
CWaitCursor cursor;
[...]
}
Это отобразило бы значок песочных часов на время функция.
istream_iterator<string>
имеет конструктор, поэтому объявление EOS
на самом деле не является no-op, как и объявления i
и x
.
Часто вы хотите объявить объект класса, а затем ничего не делать с ним. Например, рассмотрите std::lock_guard
в C ++ 0x (boost::scoped_lock
в Boost) или в любом другом классе защиты области видимости. Обычно вы ничего не хотите делать с таким объектом, просто хотите создать объект, чтобы его деструктор запустился в конце блока для выполнения любой очистки, которую нужно выполнить.