C# 比较整数的正确方法

C# 比较整数的正确方法,c#,C#,我不是C语言专家,但我知道在比较字符串时不应该简单地使用=。比较整数时,是否有类似的.Equals方法 例如,我想做如下事情: if (someInt == 2) {} 这在C#中可以接受吗 在比较字符串时,我不应该简单地使用== 为什么不呢?(假设另一个区域性或其他一些非默认比较机制适合您。)它是字符串的一个非常合理的运算符,就像它用于int一样。它告诉您这两个值是否相等,正如人们所期望的那样 这不是比较两个字符串或整数是否相等的唯一方法,但它肯定是有效的。因为int是一种值类型,它不能为n

我不是C语言专家,但我知道在比较字符串时不应该简单地使用
=
。比较整数时,是否有类似的
.Equals
方法

例如,我想做如下事情:

if (someInt == 2) {}
这在C#中可以接受吗

在比较字符串时,我不应该简单地使用==

为什么不呢?(假设另一个区域性或其他一些非默认比较机制适合您。)它是字符串的一个非常合理的运算符,就像它用于int一样。它告诉您这两个值是否相等,正如人们所期望的那样


这不是比较两个字符串或整数是否相等的唯一方法,但它肯定是有效的。

因为
int
是一种值类型,它不能为
null

因此,您可以很好地使用
=

但是,如果您有一个
MyInteger
类(值类型
int
的包装类,它从
对象
类型继承),该类可以是
null
对象,其中不包含
int

回到问题,对于
int
类型,您可以使用==刚刚好,这里有一些其他的选择:

a<代码>比较到方法

e、 g:
5.与(6)比较//返回-1
如果第一个int较小,则返回-1;如果第一个int较大,则返回0;如果第一个int较小,则返回1。此方法类似于
<>=
运算符

b<代码>Int32.Equals方法
这与
==
相同,因为它返回真/假布尔值。然而这种方法与==对于装箱的int有一个区别,正如Jon Skeet在这篇文章中详细介绍的,这与我提到的装箱和拆箱有关

对于C#中的字符串,你绝对可以使用==,我们有操作符重写。

我想我可以在这里澄清一些混淆。在
String
中选择使用.Equals over==实际上来自Java。在Java中,
String
像对象一样被包装和处理,这可能会导致一些问题,包括空指针异常。然而,这在c中不会出现,因为
String
是一种基本类型,
String.Equals(a,b)
被定义为
a==b
。Equals允许您添加比较类型,从而为您提供了一些选项。这对String.Equals有一点好处,但决不能总是使用其中一个。但是,我觉得有必要注意到,在Java中应该使用String.Equals,因为这两种语言非常相似,初学者可能会混淆。
也就是说,上面关于
inta==intb
Int32.Equals
的答案都是有效的,我会更经常地使用
=
来表示int,因为这是一种更普遍接受的做法。

这没什么错。还有一点。@UweKeim如果你想知道哪个大于另一个的话,这将是合适的。如果您只是想知道它们是否相等,请使用专门为此设计的工具。为什么您认为在比较字符串时不应该使用
==
?如果你想知道两个字符串是否完全相等,那很好。这不是Java:)@MethodMan
object.Equals
=
之间的区别与对象相等和值相等无关。两者之间唯一的区别是,
object.Equals
对第一个操作数执行虚拟分派,而
=
完全根据两个操作数的编译时类型确定要使用的实现,并且任何给定类型都不必为任何一个操作提供相同的行为(即使他们应该)。任何涉及的值的编译时或运行时类型是否为值类型或引用类型都是无关的。我认为OP可能会混淆使用==与对象以及使用字符串和值类型。事实上,.C#的
==
与Java的
=
不同,它不能被重写以使re具有语义意义引用类型如果我记得正确地做了a.Equals(x)其中x是一个空字符串对象,也会抛出一个异常,因此如果存在空值,
=
工作得更好。NET没有
Integer
类。如果您引用的是您创建的自定义类,那么这将不同于该语言的装箱/取消装箱,因为这只适用于在
ob中存储值类型ject
或它实现的接口类型的容器。C#对术语“基元类型”也没有定义;如果你指的是值类型,那么就这么说吧。感谢其他可用方法的示例!@Servy谢谢,我编辑了这篇文章来反映这一点。(Java背景,抱歉)注意,如果你真的想要一个可空的int,那么你应该使用
Nullable
类型,而不是为int创建你自己的自定义包装器。现在,如果你需要一个int的引用语义而不是值语义,那么它是合适的。你还没有解决术语“primitive”的不当使用问题或者您所指的装箱是指与实际装箱无关的内容。@Servy在任何类中放置int仍然应被视为装箱,正如MSDN文档在这里所说:在这个示例中,它突出显示的是int被“装箱”到一个对象类型,MyInteger继承自该对象类型。至于单词primitive,C#re将所有基本类型显示为对象。我使用不当,我将进行编辑。感谢您的详细解释。这很有意义。