Single.Equals Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Retourneert een waarde die aangeeft of twee exemplaren Single dezelfde waarde vertegenwoordigen.
Overloads
| Name | Description |
|---|---|
| Equals(Object) |
Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object. |
| Equals(Single) |
Retourneert een waarde die aangeeft of dit exemplaar en een opgegeven Single object dezelfde waarde vertegenwoordigen. |
Equals(Object)
Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object.
public:
override bool Equals(System::Object ^ obj);
public override bool Equals(object obj);
override this.Equals : obj -> bool
Public Overrides Function Equals (obj As Object) As Boolean
Parameters
- obj
- Object
Een object dat moet worden vergeleken met dit exemplaar.
Retouren
trueals obj dit een instantie is van Single en gelijk is aan de waarde van dit exemplaar; anders. false
Voorbeelden
In het volgende codevoorbeeld ziet u de Equals methode.
obj1 = (Single)500;
if (a.Equals(obj1)) {
Console.WriteLine("The value type and reference type values are equal.");
}
let obj1 = single 500
if a.Equals obj1 then
printfn "The value type and reference type values are equal."
Obj1 = CType(500, Single)
If A.Equals(Obj1) Then
Console.WriteLine("The value type and reference type values are equal.")
End If
Opmerkingen
De Equals methode moet voorzichtig worden gebruikt, omdat twee schijnbaar gelijkwaardige waarden ongelijk kunnen zijn vanwege de verschillende precisie van de twee waarden. In het volgende voorbeeld wordt gerapporteerd dat de Single waarde .3333 en de Single geretourneerde waarde door 1 met 3 te delen ongelijk zijn.
// 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
// Initialize two floats with apparently identical values
let float1 = 0.33333f
let float2 = box (1f / 3f)
// Compare them for equality
printfn $"{float1.Equals float2}" // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2)) ' displays False
In plaats van gelijkheid te vergelijken, moet een aanbevolen techniek een acceptabele marge van verschil tussen twee waarden definiƫren (zoals .01% van een van de waarden). Als de absolute waarde van het verschil tussen de twee waarden kleiner is dan of gelijk is aan die marge, is het verschil waarschijnlijk te wijten aan verschillen in precisie en zijn de waarden waarschijnlijk gelijk. In het volgende voorbeeld wordt deze techniek gebruikt om .33333 en 1/3 te vergelijken, de twee Single waarden die in het vorige codevoorbeeld ongelijk zijn bevonden.
// 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.");
// Initialize two floats with apparently identical values
let float1 = 0.33333f
let float2 = box (1f / 3f)
// Define the tolerance for variation in their values
let difference = abs (float1 * 0.0001f)
// Compare the values
// The output to the console indicates that the two values are equal
if abs (float1 - (float2 :?> float32)) <= difference then
printfn "float1 and float2 are equal."
else
printfn "float1 and float2 are unequal."
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)
' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - CSng(single2)) <= difference Then
Console.WriteLine("single1 and single2 are equal.")
Else
Console.WriteLine("single1 and single2 are unequal.")
End If
In dit geval zijn de waarden gelijk.
Note
Omdat Epsilon de minimumexpressie van een positieve waarde waarvan het bereik bijna nul is, definieert, moet de marge van het verschil groter zijn dan Epsilon. Meestal is het veel groter dan Epsilon.
De precisie van drijvendekommagetalnummers buiten de gedocumenteerde precisie is specifiek voor de implementatie en versie van het .NET Framework. Een vergelijking van twee bepaalde getallen kan dus veranderen tussen versies van het .NET Framework, omdat de precisie van de interne weergave van de getallen kan veranderen.
Notities voor bellers
De oplossing voor overbelasting van compilers kan een duidelijk verschil in het gedrag van de twee Equals(Object) methodeoverbelastingen zijn. Als een impliciete conversie tussen het obj argument en een Single is gedefinieerd en het argument niet als een Objectis getypt, kunnen compilers een impliciete conversie uitvoeren en de Equals(Single) methode aanroepen. Anders wordt de Equals(Object) methode aangeroepen, die altijd retourneert false als het obj argument geen Single waarde is. In het volgende voorbeeld ziet u het verschil in gedrag tussen de twee overbelastingen van de methode. In het geval van alle primitieve numerieke typen, met uitzondering van Double in Visual Basic en met uitzondering van Decimal en Double in C#, de eerste vergelijking retourneert true omdat de compiler automatisch een brede conversie uitvoert en de methode Equals(Single) aanroept, terwijl de tweede vergelijking false retourneert omdat de compiler de methode Equals(Object) aanroept.
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
let value = 112f
let testObjectForEquality (obj: obj) =
printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"
[<EntryPoint>]
let main _ =
let byte1= 112uy
printfn $"value = byte1: {value.Equals byte1,16}"
testObjectForEquality byte1
let short1 = 112s
printfn $"value = short1: {value.Equals short1,16}"
testObjectForEquality short1
let int1 = 112
printfn $"value = int1: {value.Equals int1,18}"
testObjectForEquality int1
let long1 = 112L
printfn $"value = long1: {value.Equals long1,17}"
testObjectForEquality long1
let sbyte1 = 112y
printfn $"value = sbyte1: {value.Equals sbyte1,16}"
testObjectForEquality sbyte1
let ushort1 = 112us
printfn $"value = ushort1: {value.Equals ushort1,16}"
testObjectForEquality ushort1
let uint1 = 112u
printfn $"value = uint1: {value.Equals uint1,18}"
testObjectForEquality uint1
let ulong1 = 112uL
printfn $"value = ulong1: {value.Equals ulong1,17}"
testObjectForEquality ulong1
let dec1 = 112m
printfn $"value = dec1: {value.Equals dec1,21}"
testObjectForEquality dec1
let dbl1 = 112.
printfn $"value = dbl1: {value.Equals dbl1,20}"
testObjectForEquality dbl1
0
// 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
Module Example
Dim value As Single = 112
Public Sub Main()
Dim byte1 As Byte = 112
Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
TestObjectForEquality(byte1)
Dim short1 As Short = 112
Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
TestObjectForEquality(short1)
Dim int1 As Integer = 112
Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
TestObjectForEquality(int1)
Dim long1 As Long = 112
Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
TestObjectForEquality(long1)
Dim sbyte1 As SByte = 112
Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
TestObjectForEquality(sbyte1)
Dim ushort1 As UShort = 112
Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
TestObjectForEquality(ushort1)
Dim uint1 As UInteger = 112
Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
TestObjectForEquality(uint1)
Dim ulong1 As ULong = 112
Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
TestObjectForEquality(ulong1)
Dim dec1 As Decimal = 112d
Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
TestObjectForEquality(dec1)
Dim dbl1 As Double = 112
Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1))
TestObjectForEquality(dbl1)
End Sub
Private Sub TestObjectForEquality(obj As Object)
Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
value, value.GetType().Name,
obj, obj.GetType().Name,
value.Equals(obj))
Console.WriteLine()
End Sub
End Module
' 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: True
' 112 (Single) = 112 (Decimal): False
'
' value = dbl1: False
' 112 (Single) = 112 (Double): False
Zie ook
Van toepassing op
Equals(Single)
Retourneert een waarde die aangeeft of dit exemplaar en een opgegeven Single object dezelfde waarde vertegenwoordigen.
public:
virtual bool Equals(float obj);
public bool Equals(float obj);
override this.Equals : single -> bool
Public Function Equals (obj As Single) As Boolean
Parameters
- obj
- Single
Een object dat moet worden vergeleken met dit exemplaar.
Retouren
true als obj dit gelijk is aan dit exemplaar; falseanders.
Implementeringen
Opmerkingen
Zie aanvullende API-opmerkingen voor Single.Equals voor meer informatie over deze API.
Notities voor bellers
De oplossing voor overbelasting van compilers kan een duidelijk verschil in het gedrag van de twee Equals(Object) methodeoverbelastingen zijn. Als een impliciete conversie tussen het obj argument en een Single is gedefinieerd en het argument niet als een Objectis getypt, kunnen compilers een impliciete conversie uitvoeren en de Equals(Single) methode aanroepen. Anders wordt de Equals(Object) methode aangeroepen, die altijd retourneert false als het obj argument geen Single waarde is. In het volgende voorbeeld ziet u het verschil in gedrag tussen de twee overbelastingen van de methode. In het geval van alle primitieve numerieke typen, met uitzondering van Double in Visual Basic en met uitzondering van Decimal en Double in C#, de eerste vergelijking retourneert true omdat de compiler automatisch een brede conversie uitvoert en de methode Equals(Single) aanroept, terwijl de tweede vergelijking false retourneert omdat de compiler de methode Equals(Object) aanroept.
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
let value = 112f
let testObjectForEquality (obj: obj) =
printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"
[<EntryPoint>]
let main _ =
let byte1= 112uy
printfn $"value = byte1: {value.Equals byte1,16}"
testObjectForEquality byte1
let short1 = 112s
printfn $"value = short1: {value.Equals short1,16}"
testObjectForEquality short1
let int1 = 112
printfn $"value = int1: {value.Equals int1,18}"
testObjectForEquality int1
let long1 = 112L
printfn $"value = long1: {value.Equals long1,17}"
testObjectForEquality long1
let sbyte1 = 112y
printfn $"value = sbyte1: {value.Equals sbyte1,16}"
testObjectForEquality sbyte1
let ushort1 = 112us
printfn $"value = ushort1: {value.Equals ushort1,16}"
testObjectForEquality ushort1
let uint1 = 112u
printfn $"value = uint1: {value.Equals uint1,18}"
testObjectForEquality uint1
let ulong1 = 112uL
printfn $"value = ulong1: {value.Equals ulong1,17}"
testObjectForEquality ulong1
let dec1 = 112m
printfn $"value = dec1: {value.Equals dec1,21}"
testObjectForEquality dec1
let dbl1 = 112.
printfn $"value = dbl1: {value.Equals dbl1,20}"
testObjectForEquality dbl1
0
// 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
Module Example
Dim value As Single = 112
Public Sub Main()
Dim byte1 As Byte = 112
Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
TestObjectForEquality(byte1)
Dim short1 As Short = 112
Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
TestObjectForEquality(short1)
Dim int1 As Integer = 112
Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
TestObjectForEquality(int1)
Dim long1 As Long = 112
Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
TestObjectForEquality(long1)
Dim sbyte1 As SByte = 112
Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
TestObjectForEquality(sbyte1)
Dim ushort1 As UShort = 112
Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
TestObjectForEquality(ushort1)
Dim uint1 As UInteger = 112
Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
TestObjectForEquality(uint1)
Dim ulong1 As ULong = 112
Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
TestObjectForEquality(ulong1)
Dim dec1 As Decimal = 112d
Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
TestObjectForEquality(dec1)
Dim dbl1 As Double = 112
Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1))
TestObjectForEquality(dbl1)
End Sub
Private Sub TestObjectForEquality(obj As Object)
Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
value, value.GetType().Name,
obj, obj.GetType().Name,
value.Equals(obj))
Console.WriteLine()
End Sub
End Module
' 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: True
' 112 (Single) = 112 (Decimal): False
'
' value = dbl1: False
' 112 (Single) = 112 (Double): False