2

背景:我有一个用 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:除了习惯的力量之外,我没有真正的理由想要写 if (sp)。

4

3 回答 3

17

您可能可以在 C# 中使用默认属性装饰器执行此操作,但您不应该这样做。试图将 C# 写成鸭式语言会导致各种认知失调。

根据经验,最好采用你正在使用的语言的方言,而不是试图将它塞进一个更熟悉的形式,而它从来没有打算持有。

于 2009-02-27T18:20:35.907 回答
4

我认为您可以向 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
于 2009-02-27T18:51:32.180 回答
3

C# 中的 if 语句采用布尔表达式,如果表达式为非布尔值,则不会将类型转换为布尔值,这与 C(或 Javascript)中不同。我的建议是只处理轻微的烦恼并使用标准的 C# 习惯用法。

于 2009-02-27T18:25:40.840 回答