Как можно написать класс C # для проверки как 0, так и нулевого - PullRequest
2 голосов
/ 27 февраля 2009

ПРЕДПОСЫЛКИ: У меня есть собственный класс, написанный на C # (2005), с кодом, подобным следующему:

public class Savepoint
{
  public int iOffset;                 /* Starting offset in main journal */
  public u32 nOrig;                   /* Original number of pages in file */
  public u32 iSubRec;                 /* Index of first record in sub-journal */
};

После того, как переменная была объявлена ​​с Savepoint sp; Я могу проверить, был ли создан экземпляр с кодом, подобным:

if (sp != null) {...}

ВОПРОС: Можно ли как-то перегрузить оператор класса, чтобы я мог также использовать следующий синтаксис: if (sp) {...} или if (sp! = 0) {...}

PS: У меня нет действительно веской причины хотеть писать, если (sp) кроме силы привычки.

Ответы [ 3 ]

17 голосов
/ 27 февраля 2009

Вы можете сделать это в C #, используя декоратор свойств по умолчанию, но вы не должны этого делать. Попытка написать C # так, как будто это был язык утки, приведет к разного рода когнитивному диссонансу.

Как правило, хорошей идеей является использование языка, на котором вы работаете, вместо того, чтобы пытаться превратить его в более знакомую форму, которую он никогда не должен был содержать.

4 голосов
/ 27 февраля 2009

Я думаю, что вы можете добавить неявное приведение к bool ... что-то вроде этого должно работать.

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

Пример:

Savepoint sp1 = new Savepoint();
sp1.iOffset = 4;
Savepoint sp2 = new Savepoint();
Savepoint sp3 = null;

Console.WriteLine("sp1: " + (sp1 ? "true" : "false")); // prints true
Console.WriteLine("sp2: " + (sp2 ? "true" : "false")); // prints true
Console.WriteLine("sp3: " + (sp3 ? "true" : "false")); // prints false
3 голосов
/ 27 февраля 2009

Оператор if в C # принимает логическое выражение и не выполняет преобразование типа в логическое, если выражение не является логическим, в отличие от C (или Javascript). Мой совет - просто разобраться с незначительным раздражением и использовать стандартную идиому C #.

...