作为一个很好的例子来说明这个问题。让我们看看System.Object如何包含:
Equals => with 's'
GetHashCode
GetType
ReferenceEquals => with 's'
ToString
Finalize
MemberwiseClone
那么,当我们在函数名的末尾附加一个's'时,我们可以遵循最佳实践中的一般规则吗?
// updated //
为什么不使用 Finalizes 或 MemberwiseClones ?
答案 0 :(得分:7)
不幸的是,这恰好跟随英语的变幻莫测,这对于非母语人士来说很难掌握。
这个想法是:
a.Equals(b)
应为“A等于B”。当主语是单数(如“A”)时,“等于”是及物动词“相等”的正确结合。a.GetHashCode()
应为“a getHashCode”,因为您计划从变量a
表示的对象中“获取哈希码”。a.Finalize()
应为“a dot Finalize”,这意味着您计划“完成”变量a
所代表的对象。添加“s”的其他示例通常遵循单数对复数规则。例如:
type.GetCustomAttributes()
表示会返回一系列“属性”,而不只是一个“属性”。答案 1 :(得分:1)
正如其他人所提到的,这是英语的细微差别......我会说经验法则是,如果它返回bool
,那么以's'结尾是合适的。这几乎就像是对DOXXX的缩短(DoesEqual => Equals,DoesReferenceEqual => ReferenceEquals)。对于属性,约定是使用IsXXX(IsEmpty,IsEnum等)启动属性名称。
答案 2 :(得分:0)
我似乎找不到任何可以引用你的问题的东西,但最后带有S的函数被用作动词。所以,如果按字面意思读 -
Object.Equals有什么用?或1(对象)+ 1(对象)是否等于2(对象)。
给我Object.GetHashCode。
等于更具描述性。如果我使用Equal,那么我可能会将其更改为IsEqual但Equals更短,因此使用它。
答案 3 :(得分:0)
我不认为有一个,
Equals(object,object);
比
更具描述性Equal(object,object);
答案 4 :(得分:0)
等于可以被视为“IsEqualTo”的缩写形式。使用它的主要区别是复数与单数。例如,GetType意味着单一用法,并返回一种类型。 GetTypes意味着多次使用,并且将返回多种类型(作为数组,集合等)。
答案 5 :(得分:0)
当方法名称在英文的最后一个单词中有's'时,你附加一个's'。
一般来说,你想要使用第三人称现在时态动词,然后根据需要使用单数或复数名词,并且你想尝试让你的代码几乎像英语一样阅读。因此:
bool areEqual = myObject.Equals(otherObject); // set boolean value areEqual if myObject Equals otherObject
bool containsSomething = myObject.HasSomething(); // set boolean value containsSomething if myObject Has Something
string myStr = myObject.ToString(); // myStr is myObject [converted] To String
int hashCode = myObject.GetHashCode(); // Take myObject, Get [its] Hash Code, and store into integer variable hashCode
你越了解英语,它就越有意义。
为什么不使用Finalizes()
?因为用英语表示对象正在进行终结,或者断言对象确实完成了某些事情。另一方面,Finalize()
更像是你发送给对象的命令:“你!对象!是的,你!......自己去完成!”
对于MemberwiseClone()
,这是因为只返回了一个克隆。由于克隆是一个名词,这意味着克隆将意味着不止一个克隆。