这可能是众所周知的和讨论过的,但是令我惊讶的是,我今天发现,您可以在nullable和它们的基本类型之间提供自己的运算符实现。
这意味着您可以拥有一个可以检查struct
的null
,并返回 true 。
现在这对我来说很方便-根据another member的建议,我有一个包装字符串的结构。对于我来说,能够直接将此包装的字符串直接比较为null(而不是使用.IsNull或类似名称),这很自然,这意味着从使用字符串更改为这些WrappedString常常不需要对代码进行其他更改。
但是..(我认为)此功能鲜为人知,对于任何在字符串(代表字符串)上思考结构(它是)的人来说都是违反直觉的,并且它使ReSharper混淆(structValue == null
警告“表达式总是错误”)使我认为这也许是肮脏但整洁的技巧橱柜中留下的肮脏技巧。
所以我想知道,您会采用吗?如果不是,您是否会原谅我这样做?还是真的最好不要走这条路?
public struct StringWrapper
{
private readonly string str;
public override string ToString() { return str; }
public static bool operator ==(StringWrapper a, StringWrapper b)
{ return a.str == b.str; }
public static bool operator !=(StringWrapper a, StringWrapper b)
{ return !(a == b); }
public static bool operator ==(StringWrapper a, StringWrapper? b)
{
if (!b.HasValue || b.Value.str == null) return a.str == null;
return a == (StringWrapper)b;
}
public static bool operator !=(StringWrapper a, StringWrapper? b)
{ return !(a == b); }
public static bool operator ==(StringWrapper? a, StringWrapper b)
{ return b == a; }
public static bool operator !=(StringWrapper? a, StringWrapper b)
{ return !(a == b); }
public StringWrapper(string str) { this.str = str; }
}
最佳答案
我坚信代码是自我记录的,并带有principle of least astonishment。例如,“getters”不应该修改数据,等等。乍一看,我会考虑将struct变量与null进行比较比较困惑,因此我会避免使用它(无论它看起来有多方便)。如果您期望许多人使用(或至少看一下)您的代码,则尤其如此。
关于c# - 在nullable和基本类型之间实现运算符-我应该吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7426659/