使用英语阅读

通过


Single.Equals 方法

定义

返回一个值,该值指示 Single 的两个实例是否表示同一个值。

重载

Equals(Object)

返回一个值,该值指示此实例是否等于指定的对象。

Equals(Single)

返回一个值,该值指示此实例和指定的 Single 对象是否表示相同的值。

Equals(Object)

Source:
Single.cs
Source:
Single.cs
Source:
Single.cs

返回一个值,该值指示此实例是否等于指定的对象。

C#
public override bool Equals(object obj);
C#
public override bool Equals(object? obj);

参数

obj
Object

与此实例进行比较的对象。

返回

如果 trueobj 的实例并且等于此实例的值,则为 Single;否则为 false

示例

下面的代码示例演示 Equals 了 方法。

C#
obj1 = (Single)500;
if (a.Equals(obj1)) {
    Console.WriteLine("The value type and reference type values are equal.");
}

注解

Equals应谨慎使用 方法,因为由于两个值的精度不同,两个明显等效的值可能不相等。 以下示例报告 Single 值 .3333 和 Single 返回的 除以 1 除以 3 的值不相等。

C#
// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false

建议的一种方法不是比较相等性,而是在两个值 (之间定义可接受的差差,例如) 值之一的 0.01%。 如果两个值之间的差异的绝对值小于或等于该边距,则差异可能是由于精度差异,因此,这些值可能相等。 以下示例使用此方法比较 .33333 和 1/3, Single 前一个代码示例发现两个值不相等。

C#
// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - (float) float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");

在这种情况下,值相等。

备注

由于 Epsilon 定义其范围接近零的正值的最小表达式,因此差边距必须大于 Epsilon。 通常,它比 Epsilon大很多倍。

浮点数超出记录精度的精度特定于.NET Framework的实现和版本。 因此,两个特定数字的比较可能会在.NET Framework版本之间更改,因为数字内部表示形式的精度可能会更改。

调用方说明

编译器重载解析可能说明两 Equals(Object) 种方法重载的行为存在明显差异。 如果定义了 参数和 之间的Single隐式转换obj,并且参数未类型化为 Object,编译器可能会执行隐式转换并调用 Equals(Single) 方法。 否则,它们会调用 Equals(Object) 方法,如果其obj参数不是Single值,则该方法始终返回 false 。 以下示例演示了两个方法重载之间的行为差异。 对于除 Double Visual Basic 和 C# 中的 和 Double 之外Decimal的所有基元数值类型,第一个比较返回true是因为编译器自动执行扩展转换并调用 Equals(Single) 方法,而第二个比较返回false是因为编译器调用 Equals(Object) 方法。

C#
using System;

public class Example
{
   static float value = 112;
   
   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);
      
      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);
      
      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False

另请参阅

适用于

Equals(Single)

Source:
Single.cs
Source:
Single.cs
Source:
Single.cs

返回一个值,该值指示此实例和指定的 Single 对象是否表示相同的值。

C#
public bool Equals(float obj);

参数

obj
Single

与此实例进行比较的对象。

返回

如果 true 与此实例相等,则为 obj;否则为 false

实现

注解

有关此 API 的详细信息,请参阅 Single.Equals 的补充 API 说明

调用方说明

编译器重载解析可能说明两 Equals(Object) 种方法重载的行为存在明显差异。 如果定义了 参数和 之间的Single隐式转换obj,并且参数未类型化为 Object,编译器可能会执行隐式转换并调用 Equals(Single) 方法。 否则,它们会调用 Equals(Object) 方法,如果其obj参数不是Single值,则该方法始终返回 false 。 以下示例演示了两个方法重载之间的行为差异。 对于除 Double Visual Basic 和 C# 中的 和 Double 之外Decimal的所有基元数值类型,第一个比较返回true是因为编译器自动执行扩展转换并调用 Equals(Single) 方法,而第二个比较返回false是因为编译器调用 Equals(Object) 方法。

C#
using System;

public class Example
{
   static float value = 112;
   
   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);
      
      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);
      
      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False

另请参阅

适用于