2011-02-28 44 views
0

我真的不喜欢调用String.IsNullOrEmpty(str)。这让我需要首先思考“String”类,然后在对象“str”上调用它。接受null的扩展方法的可接受名称

我喜欢调用str.IsNullOrEmpty(),它不需要我去思考“String”类。

问题是扩展方法接受null实例来调用,这不是当您调用普通方法时通常的情况。

我的问题你认为接受null的扩展方法的对称名称是什么?

  1. 对于字符串,这很容易, “IsNullOrEmpty()”(任何包含 “ISNULL”)的声音对我好。

  2. 对于其他人,比如GetDisplayName(),我们是否将其命名为“NullOrGetDisplayName”?

回答

1

如何NullSafeGetDisplayNameGetDisplayNameNullSafe,表示这是它的安全调用,即使它被称为上的对象是null

0

Nullable类有一个名为GetValueOrDefault的方法。相同的形式可用于某些扩展方法:GetDisplayNameOrDefault或可能更具体的GetDisplayNameOrNullGetDisplayNameOrEmpty

+0

我对此有疑问。例如,((string [])arStr).FirstOrDefault()也使用“Default”关键字,但在空实例上调用该方法并不安全。 – GaryX 2011-02-28 23:20:13

1

我会为mystring.IsNullOrEmpty()寻找可以查询“空”对象的方法 - 显然它会检查字符串是否为空,并且只要您与整个代码库中的命名一致,没有人会理解任何问题/学习它的意思。

有关适用的东西的对象,忽略空的对象,我会使用“安全”,如SafeGetDisplayName()方法 - 这是一种常见的长期使用的标准(CF GetSafeHandle()的MFC)

2

首先,你的想法是错误的,你应该调整它。考虑在空对象上调用方法是不正确的;确实这就是为什么你想看看它是否为空的原因!其次,一种方法意味着它在它所具有的参数中接受空值。我不认为命名约定在这里是适当的。您可能可以通过例如Spec#消除类中的空值。

+0

Thx为您解答。 Spec#我什么都不知道。它现在准备好使用了吗?另外,你的意思是我应该保持旧的方式来使用String.IsNullOrEmpty(str)并在实际环境中遭受一些不便(我认为完全可以做安全/防御性编程,而不是方便编程)? – GaryX 2011-02-28 23:23:24

+0

实际上,您可能可以通过代码合同执行相同的操作:http://research.microsoft.com/en-us/projects/contracts/我认为(不确定)包含在最新版本的东西中( .NET 4或VS 2010或类似软件)。我想是的,你应该承受一些不便,以确定你是否应该考虑消除空(这将是更多的工作)。 FWIW,它需要1秒钟的时间才能输入'string.IsNullOrEmpty(foo)',并且通常在此基础上,我做了一些“很好”的事情(报告错误,不管)。所以我一般不认为它是浪费的。 – 2011-02-28 23:37:06

+1

很多人认为,在一个空物体上打一个电话是“邪恶的”,但只要对呼叫者清​​楚它意味着什么*,它就非常优雅和安全。在计算机编程中使用“nulls”有很长的历史(例如,当你想删除它时将数据管道到/ dev/null,在SQL中NULL可以被认为是数据库条目是“空的”),并且它是与集合的自然匹配:将“if(collection!= null && collection.Count> 0)”的优雅/可读性与“if(collection.IsEmpty)”的优雅/可读性进行比较。意思是否令人困惑?我认为空集合直观地必须是空的。 – 2011-02-28 23:48:18

1

我只是不明白你在这里的思维方式。写一些类似于nullObject.IsNullOrWhatever()的东西根本没有任何意义。你可能会也可能不喜欢这个静态表单,但是你的解决方案对我来说确实是错误的。

+0

? – GaryX 2011-02-28 23:26:29

+1

问题是调用空对象上的函数。语言让你做某事的事实并不总是意味着它是正确的。 bool result =(str!= null)&& str.AskWhateverYouLike()是每个人都会理解的东西。你的解决方案会让人们挠头,直到他们意识到发生了什么。这就像喝水,以确定我是否渴了。 – Trap 2011-02-28 23:53:45