背景:我有一个用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)。答案 0 :(得分:17)
您可以使用默认的属性装饰器在C#中执行此操作,但您不应该这样做。试着编写C#就好像是一种鸭式语言会导致各种各样的认知失调。
根据经验,最好接受你正在使用的语言的白话,而不是试图把它塞进一个从未打算过的更熟悉的形状。
答案 1 :(得分: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
答案 2 :(得分:3)
C#中的if语句采用布尔表达式,如果表达式是非布尔值,则不会将类型转换为布尔值,这与C(或Javascript)不同。我的建议是只处理轻微的烦恼并使用标准的C#成语。