Почему новое при возврате для перегруженных операторов для реализации DBBool (TriState) в C#

Если вы ищете DBBool реализация в C#, несколько перегруженных операторов (логические операторы |, &, !) новое время возвращения. Я считаю, что нет необходимости и небольшая трата памяти. DBBool - это структура, и копия создается, когда она передается в метод, поэтому для этого нет причин.

// Logical negation operator. Returns True if the operand is False, Null 
// if the operand is Null, or False if the operand is True. 
public static DBBool operator !(DBBool x)
{
    return new DBBool(-x.value);
}
// Logical AND operator. Returns False if either operand is False, 
// Null if either operand is Null, otherwise True. 
public static DBBool operator &(DBBool x, DBBool y)
{
    return new DBBool(x.value < y.value ? x.value : y.value);
}
// Logical OR operator. Returns True if either operand is True,  
// Null if either operand is Null, otherwise False. 
public static DBBool operator |(DBBool x, DBBool y)
{
    return new DBBool(x.value > y.value ? x.value : y.value);
}

Так и должно быть без нововведений.

public static DBBool operator !(DBBool x)
{
    if (x.value > 0) return False;
    if (x.value < 0) return True;
    return Null;
}
public static DBBool operator &(DBBool x, DBBool y)
{
    return x.value < y.value ? x : y;
}
public static DBBool operator |(DBBool x, DBBool y)
{
    return x.value > y.value ? x : y;
}

1 ответ

Решение
  1. это структура, поэтому "новый" действительно означает "инициализировать значение в стеке" - это дешево и не то же самое, что новый объект
  2. большинство структур неизменны; Я предполагаю, что это тоже; следовательно, он не может просто изменить значение параметра и вернуть его - он должен инициализировать новое значение с желаемым содержимым
Другие вопросы по тегам