Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
Een Boolean-exemplaar kan twee waarden hebben: true of false.
De Boolean-structuur biedt methoden die ondersteuning bieden voor de volgende taken:
- Booleaanse waarden converteren naar tekenreeksen: ToString
- Tekenreeksen parseren om ze te converteren naar Booleaanse waarden: Parse en TryParse
- Waarden vergelijken: CompareTo en Equals
In dit artikel worden deze taken en andere gebruiksgegevens uitgelegd.
Booleaanse waarden opmaken
De tekenreeksweergave van een Boolean is 'Waar' voor een true waarde of 'Onwaar' voor een false waarde. De tekenreeksweergave van een Boolean-waarde wordt gedefinieerd door de velden alleen-lezen TrueString en FalseString.
U gebruikt de methode ToString om Booleaanse waarden te converteren naar tekenreeksen. De Booleaanse structuur bevat twee ToString overloads: de parameterloze ToString() methode en de ToString(IFormatProvider) methode, die een parameter bevat waarmee de opmaak wordt beheerd. Omdat deze parameter echter wordt genegeerd, produceren de twee overbelastingen identieke tekenreeksen. De methode ToString(IFormatProvider) biedt geen ondersteuning voor cultuurgevoelige opmaak.
In het volgende voorbeeld ziet u de opmaak met de methode ToString. Houd er rekening mee dat in de voorbeelden van C# en VB de samengestelde opmaak functie wordt gebruikt, terwijl in het F#-voorbeeld tekenreeksinterpolatiewordt gebruikt. In beide gevallen wordt de methode ToString impliciet aangeroepen.
using System;
public class Example10
{
public static void Main()
{
bool raining = false;
bool busLate = true;
Console.WriteLine($"It is raining: {raining}");
Console.WriteLine($"The bus is late: {busLate}");
}
}
// The example displays the following output:
// It is raining: False
// The bus is late: True
let raining = false
let busLate = true
printfn $"It is raining: {raining}"
printfn $"The bus is late: {busLate}"
// The example displays the following output:
// It is raining: False
// The bus is late: True
Module Example9
Public Sub Main()
Dim raining As Boolean = False
Dim busLate As Boolean = True
Console.WriteLine("It is raining: {0}", raining)
Console.WriteLine("The bus is late: {0}", busLate)
End Sub
End Module
' The example displays the following output:
' It is raining: False
' The bus is late: True
Omdat de Boolean structuur slechts twee waarden kan hebben, is het eenvoudig om aangepaste opmaak toe te voegen. Voor eenvoudige aangepaste opmaak waarin andere letterlijke tekenreeksen worden vervangen door Waar en Onwaar, kunt u elke functie voor voorwaardelijke evaluatie gebruiken die wordt ondersteund door uw taal, zoals de voorwaardelijke operator in C# of de If-operator in Visual Basic. In het volgende voorbeeld wordt deze techniek gebruikt om Boolean waarden op te maken als 'Ja' en 'Nee' in plaats van 'Waar' en 'Onwaar'.
using System;
public class Example11
{
public static void Main()
{
bool raining = false;
bool busLate = true;
Console.WriteLine($"It is raining: {(raining ? "Yes" : "No")}");
Console.WriteLine($"The bus is late: {(busLate ? "Yes" : "No")}");
}
}
// The example displays the following output:
// It is raining: No
// The bus is late: Yes
Module Example
Public Sub Main()
Dim raining As Boolean = False
Dim busLate As Boolean = True
Console.WriteLine("It is raining: {0}",
If(raining, "Yes", "No"))
Console.WriteLine("The bus is late: {0}",
If(busLate, "Yes", "No"))
End Sub
End Module
' The example displays the following output:
' It is raining: No
' The bus is late: Yes
let raining = false
let busLate = true
printfn $"""It is raining: %s{if raining then "Yes" else "No"}"""
printfn $"""The bus is late: %s{if busLate then "Yes" else "No"}"""
// The example displays the following output:
// It is raining: No
// The bus is late: Yes
Voor complexere bewerkingen voor aangepaste opmaak, inclusief cultuurgevoelige opmaak, kunt u de methode String.Format(IFormatProvider, String, Object[]) aanroepen en een ICustomFormatter implementatie bieden. In het volgende voorbeeld worden de ICustomFormatter- en IFormatProvider interfaces geïmplementeerd om cultuurgevoelige Booleaanse tekenreeksen te bieden voor de Engelse (Verenigde Staten), Frans (Frankrijk) en Russische (Rusland) culturen.
using System;
using System.Globalization;
public class Example4
{
public static void Main()
{
String[] cultureNames = { "", "en-US", "fr-FR", "ru-RU" };
foreach (var cultureName in cultureNames) {
bool value = true;
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
BooleanFormatter formatter = new BooleanFormatter(culture);
string result = string.Format(formatter, "Value for '{0}': {1}", culture.Name, value);
Console.WriteLine(result);
}
}
}
public class BooleanFormatter : ICustomFormatter, IFormatProvider
{
private CultureInfo culture;
public BooleanFormatter() : this(CultureInfo.CurrentCulture)
{ }
public BooleanFormatter(CultureInfo culture)
{
this.culture = culture;
}
public Object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
public string Format(string fmt, Object arg, IFormatProvider formatProvider)
{
// Exit if another format provider is used.
if (! formatProvider.Equals(this)) return null;
// Exit if the type to be formatted is not a Boolean
if (! (arg is Boolean)) return null;
bool value = (bool) arg;
switch (culture.Name) {
case "en-US":
return value.ToString();
case "fr-FR":
if (value)
return "vrai";
else
return "faux";
case "ru-RU":
if (value)
return "верно";
else
return "неверно";
default:
return value.ToString();
}
}
}
// The example displays the following output:
// Value for '': True
// Value for 'en-US': True
// Value for 'fr-FR': vrai
// Value for 'ru-RU': верно
open System
open System.Globalization
type BooleanFormatter(culture) =
interface ICustomFormatter with
member this.Format(_, arg, formatProvider) =
if formatProvider <> this then null
else
match arg with
| :? bool as value ->
match culture.Name with
| "en-US" -> string arg
| "fr-FR" when value -> "vrai"
| "fr-FR" -> "faux"
| "ru-RU" when value -> "верно"
| "ru-RU" -> "неверно"
| _ -> string arg
| _ -> null
interface IFormatProvider with
member this.GetFormat(formatType) =
if formatType = typeof<ICustomFormatter> then this
else null
new() = BooleanFormatter CultureInfo.CurrentCulture
let cultureNames = [ ""; "en-US"; "fr-FR"; "ru-RU" ]
for cultureName in cultureNames do
let value = true
let culture = CultureInfo.CreateSpecificCulture cultureName
let formatter = BooleanFormatter culture
String.Format(formatter, "Value for '{0}': {1}", culture.Name, value)
|> printfn "%s"
// The example displays the following output:
// Value for '': True
// Value for 'en-US': True
// Value for 'fr-FR': vrai
// Value for 'ru-RU': верно
Imports System.Globalization
Module Example4
Public Sub Main()
Dim cultureNames() As String = {"", "en-US", "fr-FR", "ru-RU"}
For Each cultureName In cultureNames
Dim value As Boolean = True
Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
Dim formatter As New BooleanFormatter(culture)
Dim result As String = String.Format(formatter, "Value for '{0}': {1}", culture.Name, value)
Console.WriteLine(result)
Next
End Sub
End Module
Public Class BooleanFormatter
Implements ICustomFormatter, IFormatProvider
Private culture As CultureInfo
Public Sub New()
Me.New(CultureInfo.CurrentCulture)
End Sub
Public Sub New(culture As CultureInfo)
Me.culture = culture
End Sub
Public Function GetFormat(formatType As Type) As Object _
Implements IFormatProvider.GetFormat
If formatType Is GetType(ICustomFormatter) Then
Return Me
Else
Return Nothing
End If
End Function
Public Function Format(fmt As String, arg As Object,
formatProvider As IFormatProvider) As String _
Implements ICustomFormatter.Format
' Exit if another format provider is used.
If Not formatProvider.Equals(Me) Then Return Nothing
' Exit if the type to be formatted is not a Boolean
If Not TypeOf arg Is Boolean Then Return Nothing
Dim value As Boolean = CBool(arg)
Select culture.Name
Case "en-US"
Return value.ToString()
Case "fr-FR"
If value Then
Return "vrai"
Else
Return "faux"
End If
Case "ru-RU"
If value Then
Return "верно"
Else
Return "неверно"
End If
Case Else
Return value.ToString()
End Select
End Function
End Class
' The example displays the following output:
' Value for '': True
' Value for 'en-US': True
' Value for 'fr-FR': vrai
' Value for 'ru-RU': верно
U kunt eventueel resourcebestanden gebruiken om cultuurspecifieke Booleaanse tekenreeksen te definiëren.
Converteren naar en van Booleaanse waarden
De Boolean-structuur implementeert de IConvertible-interface. Als gevolg hiervan kunt u de Convert-klasse gebruiken om conversies uit te voeren tussen een Boolean-waarde en elk ander primitief type in .NET, of u kunt de expliciete implementaties van de Boolean structuur aanroepen. Conversies tussen een Boolean en de volgende typen worden echter niet ondersteund, dus de bijbehorende conversiemethoden genereren een InvalidCastException uitzondering:
Conversie tussen Boolean en Char (de methoden Convert.ToBoolean(Char) en Convert.ToChar(Boolean)).
Conversie tussen Boolean en DateTime (de methoden Convert.ToBoolean(DateTime) en Convert.ToDateTime(Boolean)).
Alle conversies van integrale of drijvendekommagetallen naar Booleaanse waarden converteren niet-nulwaarden naar true en nulwaarden naar false. In het volgende voorbeeld ziet u dit door geselecteerde overbelastingen van de Convert.ToBoolean-klasse aan te roepen.
using System;
public class Example2
{
public static void Main()
{
Byte byteValue = 12;
Console.WriteLine(Convert.ToBoolean(byteValue));
Byte byteValue2 = 0;
Console.WriteLine(Convert.ToBoolean(byteValue2));
int intValue = -16345;
Console.WriteLine(Convert.ToBoolean(intValue));
long longValue = 945;
Console.WriteLine(Convert.ToBoolean(longValue));
SByte sbyteValue = -12;
Console.WriteLine(Convert.ToBoolean(sbyteValue));
double dblValue = 0;
Console.WriteLine(Convert.ToBoolean(dblValue));
float sngValue = .0001f;
Console.WriteLine(Convert.ToBoolean(sngValue));
}
}
// The example displays the following output:
// True
// False
// True
// True
// True
// False
// True
open System
let byteValue = 12uy
printfn $"{Convert.ToBoolean byteValue}"
let byteValue2 = 0uy
printfn $"{Convert.ToBoolean byteValue2}"
let intValue = -16345
printfn $"{Convert.ToBoolean intValue}"
let longValue = 945L
printfn $"{Convert.ToBoolean longValue}"
let sbyteValue = -12y
printfn $"{Convert.ToBoolean sbyteValue}"
let dblValue = 0.0
printfn $"{Convert.ToBoolean dblValue}"
let sngValue = 0.0001f
printfn $"{Convert.ToBoolean sngValue}"
// The example displays the following output:
// True
// False
// True
// True
// True
// False
// True
Module Example2
Public Sub Main()
Dim byteValue As Byte = 12
Console.WriteLine(Convert.ToBoolean(byteValue))
Dim byteValue2 As Byte = 0
Console.WriteLine(Convert.ToBoolean(byteValue2))
Dim intValue As Integer = -16345
Console.WriteLine(Convert.ToBoolean(intValue))
Dim longValue As Long = 945
Console.WriteLine(Convert.ToBoolean(longValue))
Dim sbyteValue As SByte = -12
Console.WriteLine(Convert.ToBoolean(sbyteValue))
Dim dblValue As Double = 0
Console.WriteLine(Convert.ToBoolean(dblValue))
Dim sngValue As Single = 0.0001
Console.WriteLine(Convert.ToBoolean(sngValue))
End Sub
End Module
' The example displays the following output:
' True
' False
' True
' True
' True
' False
' True
Bij het converteren van Booleaanse waarde naar numerieke waarden, converteren de conversiemethoden van de Convert klasse true naar 1 en false naar 0. Visual Basic-conversiefuncties converteren echter true naar 255 (voor conversies naar Byte waarden) of -1 (voor alle andere numerieke conversies). In het volgende voorbeeld worden true geconverteerd naar numerieke waarden met behulp van een Convert methode en, in het geval van het Visual Basic-voorbeeld, met behulp van de eigen conversieoperator van de Visual Basic-taal.
using System;
public class Example3
{
public static void Main()
{
bool flag = true;
byte byteValue;
byteValue = Convert.ToByte(flag);
Console.WriteLine($"{flag} -> {byteValue}");
sbyte sbyteValue;
sbyteValue = Convert.ToSByte(flag);
Console.WriteLine($"{flag} -> {sbyteValue}");
double dblValue;
dblValue = Convert.ToDouble(flag);
Console.WriteLine($"{flag} -> {dblValue}");
int intValue;
intValue = Convert.ToInt32(flag);
Console.WriteLine($"{flag} -> {intValue}");
}
}
// The example displays the following output:
// True -> 1
// True -> 1
// True -> 1
// True -> 1
open System
let flag = true
let byteValue = Convert.ToByte flag
printfn $"{flag} -> {byteValue}"
let sbyteValue = Convert.ToSByte flag
printfn $"{flag} -> {sbyteValue}"
let dblValue = Convert.ToDouble flag
printfn $"{flag} -> {dblValue}"
let intValue = Convert.ToInt32(flag);
printfn $"{flag} -> {intValue}"
// The example displays the following output:
// True -> 1
// True -> 1
// True -> 1
// True -> 1
Module Example3
Public Sub Main()
Dim flag As Boolean = True
Dim byteValue As Byte
byteValue = Convert.ToByte(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, byteValue,
byteValue.GetType().Name)
byteValue = CByte(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, byteValue,
byteValue.GetType().Name)
Dim sbyteValue As SByte
sbyteValue = Convert.ToSByte(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, sbyteValue,
sbyteValue.GetType().Name)
sbyteValue = CSByte(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, sbyteValue,
sbyteValue.GetType().Name)
Dim dblValue As Double
dblValue = Convert.ToDouble(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, dblValue,
dblValue.GetType().Name)
dblValue = CDbl(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, dblValue,
dblValue.GetType().Name)
Dim intValue As Integer
intValue = Convert.ToInt32(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, intValue,
intValue.GetType().Name)
intValue = CInt(flag)
Console.WriteLine("{0} -> {1} ({2})", flag, intValue,
intValue.GetType().Name)
End Sub
End Module
' The example displays the following output:
' True -> 1 (Byte)
' True -> 255 (Byte)
' True -> 1 (SByte)
' True -> -1 (SByte)
' True -> 1 (Double)
' True -> -1 (Double)
' True -> 1 (Int32)
' True -> -1 (Int32)
Voor conversies van Boolean naar tekenreekswaarden, zie de sectie Booleaanse waarden opmaken. Voor conversies van tekenreeksen naar Boolean waarden, zie de sectie Booleaanse waarden parsen.
Booleaanse waarden parseren
De Boolean-structuur bevat twee statische parseringsmethoden, Parse en TryParse, waarmee een tekenreeks wordt geconverteerd naar een Booleaanse waarde. De tekenreeksweergave van een Booleaanse waarde wordt gedefinieerd door de hoofdlettergevoelige equivalenten van de waarden van de velden TrueString en FalseString, die respectievelijk Waar en Onwaar zijn. Met andere woorden, de enige tekenreeksen die met succes worden geparseerd, zijn 'True', 'False', 'true', 'false' of een equivalent van gemengde letters. U kunt geen numerieke tekenreeksen parseren, zoals '0' of '1'. Voorloop- of volgspaties worden niet meegenomen bij het uitvoeren van de stringvergelijking.
In het volgende voorbeeld worden de methoden Parse en TryParse gebruikt om een aantal tekenreeksen te parseren. Houd er rekening mee dat alleen de niet-hoofdlettergevoelige equivalenten 'Waar' en 'Onwaar' met succes kunnen worden geparseerd.
using System;
public class Example7
{
public static void Main()
{
string[] values = { null, String.Empty, "True", "False",
"true", "false", " true ",
"TrUe", "fAlSe", "fa lse", "0",
"1", "-1", "string" };
// Parse strings using the Boolean.Parse method.
foreach (var value in values) {
try {
bool flag = Boolean.Parse(value);
Console.WriteLine($"'{value}' --> {flag}");
}
catch (ArgumentException) {
Console.WriteLine("Cannot parse a null string.");
}
catch (FormatException) {
Console.WriteLine($"Cannot parse '{value}'.");
}
}
Console.WriteLine();
// Parse strings using the Boolean.TryParse method.
foreach (var value in values) {
bool flag = false;
if (Boolean.TryParse(value, out flag))
Console.WriteLine($"'{value}' --> {flag}");
else
Console.WriteLine($"Unable to parse '{value}'");
}
}
}
// The example displays the following output:
// Cannot parse a null string.
// Cannot parse ''.
// 'True' --> True
// 'False' --> False
// 'true' --> True
// 'false' --> False
// ' true ' --> True
// 'TrUe' --> True
// 'fAlSe' --> False
// Cannot parse 'fa lse'.
// Cannot parse '0'.
// Cannot parse '1'.
// Cannot parse '-1'.
// Cannot parse 'string'.
//
// Unable to parse ''
// Unable to parse ''
// 'True' --> True
// 'False' --> False
// 'true' --> True
// 'false' --> False
// ' true ' --> True
// 'TrUe' --> True
// 'fAlSe' --> False
// Cannot parse 'fa lse'.
// Unable to parse '0'
// Unable to parse '1'
// Unable to parse '-1'
// Unable to parse 'string'
open System
let values =
[ null; String.Empty; "True"; "False"
"true"; "false"; " true "
"TrUe"; "fAlSe"; "fa lse"; "0"
"1"; "-1"; "string" ]
// Parse strings using the Boolean.Parse method.
for value in values do
try
let flag = Boolean.Parse value
printfn $"'{value}' --> {flag}"
with
| :? ArgumentException ->
printfn "Cannot parse a null string."
| :? FormatException ->
printfn $"Cannot parse '{value}'."
printfn ""
// Parse strings using the Boolean.TryParse method.
for value in values do
match Boolean.TryParse value with
| true, flag ->
printfn $"'{value}' --> {flag}"
| false, _ ->
printfn $"Unable to parse '{value}'"
// The example displays the following output:
// Cannot parse a null string.
// Cannot parse ''.
// 'True' --> True
// 'False' --> False
// 'true' --> True
// 'false' --> False
// ' true ' --> True
// 'TrUe' --> True
// 'fAlSe' --> False
// Cannot parse 'fa lse'.
// Cannot parse '0'.
// Cannot parse '1'.
// Cannot parse '-1'.
// Cannot parse 'string'.
//
// Unable to parse ''
// Unable to parse ''
// 'True' --> True
// 'False' --> False
// 'true' --> True
// 'false' --> False
// ' true ' --> True
// 'TrUe' --> True
// 'fAlSe' --> False
// Cannot parse 'fa lse'.
// Unable to parse '0'
// Unable to parse '1'
// Unable to parse '-1'
// Unable to parse 'string'
Module Example7
Public Sub Main()
Dim values() As String = {Nothing, String.Empty, "True", "False",
"true", "false", " true ",
"TrUe", "fAlSe", "fa lse", "0",
"1", "-1", "string"}
' Parse strings using the Boolean.Parse method.
For Each value In values
Try
Dim flag As Boolean = Boolean.Parse(value)
Console.WriteLine("'{0}' --> {1}", value, flag)
Catch e As ArgumentException
Console.WriteLine("Cannot parse a null string.")
Catch e As FormatException
Console.WriteLine("Cannot parse '{0}'.", value)
End Try
Next
Console.WriteLine()
' Parse strings using the Boolean.TryParse method.
For Each value In values
Dim flag As Boolean = False
If Boolean.TryParse(value, flag) Then
Console.WriteLine("'{0}' --> {1}", value, flag)
Else
Console.WriteLine("Cannot parse '{0}'.", value)
End If
Next
End Sub
End Module
' The example displays the following output:
' Cannot parse a null string.
' Cannot parse ''.
' 'True' --> True
' 'False' --> False
' 'true' --> True
' 'false' --> False
' ' true ' --> True
' 'TrUe' --> True
' 'fAlSe' --> False
' Cannot parse 'fa lse'.
' Cannot parse '0'.
' Cannot parse '1'.
' Cannot parse '-1'.
' Cannot parse 'string'.
'
' Unable to parse ''
' Unable to parse ''
' 'True' --> True
' 'False' --> False
' 'true' --> True
' 'false' --> False
' ' true ' --> True
' 'TrUe' --> True
' 'fAlSe' --> False
' Cannot parse 'fa lse'.
' Unable to parse '0'
' Unable to parse '1'
' Unable to parse '-1'
' Unable to parse 'string'
Als u programmeert in Visual Basic, kunt u de functie CBool gebruiken om de tekenreeksweergave van een getal te converteren naar een Booleaanse waarde. '0' wordt geconverteerd naar falseen de tekenreeksweergave van een waarde die niet nul is, wordt geconverteerd naar true. Als u niet programmeert in Visual Basic, moet u uw numerieke tekenreeks converteren naar een getal voordat u deze converteert naar een Booleaanse waarde. In het volgende voorbeeld ziet u dit door een matrix met gehele getallen te converteren naar Booleaanse waarden.
using System;
public class Example8
{
public static void Main()
{
String[] values = { "09", "12.6", "0", "-13 " };
foreach (var value in values) {
bool success, result;
int number;
success = Int32.TryParse(value, out number);
if (success) {
// The method throws no exceptions.
result = Convert.ToBoolean(number);
Console.WriteLine($"Converted '{value}' to {result}");
}
else {
Console.WriteLine($"Unable to convert '{value}'");
}
}
}
}
// The example displays the following output:
// Converted '09' to True
// Unable to convert '12.6'
// Converted '0' to False
// Converted '-13 ' to True
open System
let values = [ "09"; "12.6"; "0"; "-13 " ]
for value in values do
match Int32.TryParse value with
| true, number ->
// The method throws no exceptions.
let result = Convert.ToBoolean number
printfn $"Converted '{value}' to {result}"
| false, _ ->
printfn $"Unable to convert '{value}'"
// The example displays the following output:
// Converted '09' to True
// Unable to convert '12.6'
// Converted '0' to False
// Converted '-13 ' to True
Module Example8
Public Sub Main()
Dim values() As String = {"09", "12.6", "0", "-13 "}
For Each value In values
Dim success, result As Boolean
Dim number As Integer
success = Int32.TryParse(value, number)
If success Then
' The method throws no exceptions.
result = Convert.ToBoolean(number)
Console.WriteLine("Converted '{0}' to {1}", value, result)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
Next
End Sub
End Module
' The example displays the following output:
' Converted '09' to True
' Unable to convert '12.6'
' Converted '0' to False
' Converted '-13 ' to True
Booleaanse waarden vergelijken
Omdat Booleaanse waarden true of falsezijn, is er weinig reden om de CompareTo methode expliciet aan te roepen, wat aangeeft of een exemplaar groter is dan, kleiner dan of gelijk is aan een opgegeven waarde. Als u doorgaans twee Booleaanse variabelen wilt vergelijken, roept u de methode Equals aan of gebruikt u de gelijkheidsoperator van uw taal.
Als u echter een Booleaanse variabele wilt vergelijken met de letterlijke Booleaanse waarde true of false, is het niet nodig om een expliciete vergelijking uit te voeren, omdat het resultaat van het evalueren van een Booleaanse waarde die Booleaanse waarde is. De volgende twee expressies zijn bijvoorbeeld gelijkwaardig, maar de tweede is compacter. Beide technieken bieden echter vergelijkbare prestaties.
if (booleanValue == true) {
if booleanValue = true then
If booleanValue = True Then
if (booleanValue) {
if booleanValue then
If booleanValue Then
Werken met Booleaanse waarden als binaire waarden
Een Booleaanse waarde neemt één byte aan geheugen in beslag, zoals in het volgende voorbeeld wordt weergegeven. Het C#-voorbeeld moet worden gecompileerd met de /unsafe switch.
using System;
public struct BoolStruct
{
public bool flag1;
public bool flag2;
public bool flag3;
public bool flag4;
public bool flag5;
}
public class Example9
{
public static void Main()
{
unsafe {
BoolStruct b = new BoolStruct();
bool* addr = (bool*) &b;
Console.WriteLine($"Size of BoolStruct: {sizeof(BoolStruct)}");
Console.WriteLine("Field offsets:");
Console.WriteLine($" flag1: {(bool*) &b.flag1 - addr}");
Console.WriteLine($" flag2: {(bool*) &b.flag2 - addr}");
Console.WriteLine($" flag3: {(bool*) &b.flag3 - addr}");
Console.WriteLine($" flag4: {(bool*) &b.flag4 - addr}");
Console.WriteLine($" flag5: {(bool*) &b.flag5 - addr}");
}
}
}
// The example displays the following output:
// Size of BoolStruct: 5
// Field offsets:
// flag1: 0
// flag2: 1
// flag3: 2
// flag4: 3
// flag5: 4
#nowarn "9" "51"
open FSharp.NativeInterop
[<Struct>]
type BoolStruct =
val flag1: bool
val flag2: bool
val flag3: bool
val flag4: bool
val flag5: bool
let inline nint addr = NativePtr.toNativeInt addr
let mutable b = BoolStruct()
let addr = &&b
printfn $"Size of BoolStruct: {sizeof<BoolStruct>}"
printfn "Field offsets:"
printfn $" flag1: {nint &&b.flag1 - nint addr}"
printfn $" flag2: {nint &&b.flag2 - nint addr}"
printfn $" flag3: {nint &&b.flag3 - nint addr}"
printfn $" flag4: {nint &&b.flag4 - nint addr}"
printfn $" flag5: {nint &&b.flag5 - nint addr}"
// The example displays the following output:
// Size of BoolStruct: 5
// Field offsets:
// flag1: 0
// flag1: 1
// flag1: 2
// flag1: 3
// flag1: 4
De bit met lage volgorde van de byte wordt gebruikt om de waarde ervan weer te geven. Een waarde van 1 vertegenwoordigt true; een waarde van 0 vertegenwoordigt false.
Hint
U kunt de System.Collections.Specialized.BitVector32 structuur gebruiken om te werken met sets booleaanse waarden.
U kunt een Booleaanse waarde converteren naar de binaire weergave door de BitConverter.GetBytes(Boolean) methode aan te roepen. De methode retourneert een bytematrix met één element. Als u een Booleaanse waarde wilt herstellen vanuit de binaire weergave, kunt u de methode BitConverter.ToBoolean(Byte[], Int32) aanroepen.
In het volgende voorbeeld wordt de BitConverter.GetBytes methode aangeroepen om een Booleaanse waarde te converteren naar de binaire weergave en worden de afzonderlijke bits van de waarde weergegeven. Vervolgens wordt de BitConverter.ToBoolean methode aangeroepen om de waarde te herstellen vanuit de binaire weergave.
using System;
public class Example1
{
public static void Main()
{
bool[] flags = { true, false };
foreach (var flag in flags)
{
// Get binary representation of flag.
Byte value = BitConverter.GetBytes(flag)[0];
Console.WriteLine($"Original value: {flag}");
Console.WriteLine($"Binary value: {value} ({GetBinaryString(value)})");
// Restore the flag from its binary representation.
bool newFlag = BitConverter.ToBoolean(new Byte[] { value }, 0);
Console.WriteLine($"Restored value: {newFlag}{Environment.NewLine}");
}
}
private static string GetBinaryString(Byte value)
{
string retVal = Convert.ToString(value, 2);
return new string('0', 8 - retVal.Length) + retVal;
}
}
// The example displays the following output:
// Original value: True
// Binary value: 1 (00000001)
// Restored value: True
//
// Original value: False
// Binary value: 0 (00000000)
// Restored value: False
open System
let getBinaryString (value: byte) =
let retValue = Convert.ToString(value, 2)
String('0', 8 - retValue.Length) + retValue
let flags = [ true; false ]
for flag in flags do
// Get binary representation of flag.
let value = BitConverter.GetBytes(flag)[0];
printfn $"Original value: {flag}"
printfn $"Binary value: {value} ({getBinaryString value})"
// Restore the flag from its binary representation.
let newFlag = BitConverter.ToBoolean([|value|], 0)
printfn $"Restored value: {newFlag}\n"
// The example displays the following output:
// Original value: True
// Binary value: 1 (00000001)
// Restored value: True
//
// Original value: False
// Binary value: 0 (00000000)
// Restored value: False
Module Example1
Public Sub Main()
Dim flags() As Boolean = {True, False}
For Each flag In flags
' Get binary representation of flag.
Dim value As Byte = BitConverter.GetBytes(flag)(0)
Console.WriteLine("Original value: {0}", flag)
Console.WriteLine("Binary value: {0} ({1})", value,
GetBinaryString(value))
' Restore the flag from its binary representation.
Dim newFlag As Boolean = BitConverter.ToBoolean({value}, 0)
Console.WriteLine("Restored value: {0}", newFlag)
Console.WriteLine()
Next
End Sub
Private Function GetBinaryString(value As Byte) As String
Dim retVal As String = Convert.ToString(value, 2)
Return New String("0"c, 8 - retVal.Length) + retVal
End Function
End Module
' The example displays the following output:
' Original value: True
' Binary value: 1 (00000001)
' Restored value: True
'
' Original value: False
' Binary value: 0 (00000000)
' Restored value: False
Bewerkingen uitvoeren met Booleaanse waarden
In deze sectie ziet u hoe Booleaanse waarden worden gebruikt in apps. In de eerste sectie wordt het gebruik ervan besproken als vlag. De tweede illustreert het gebruik voor rekenkundige bewerkingen.
Booleaanse waarden als vlaggen
Booleaanse variabelen worden meestal gebruikt als vlaggen om de aanwezigheid of afwezigheid van een bepaalde voorwaarde aan te geven. In de methode String.Compare(String, String, Boolean) is de laatste parameter, ignoreCase, bijvoorbeeld een vlag die aangeeft of de vergelijking van twee tekenreeksen niet hoofdlettergevoelig is (ignoreCase is true) of hoofdlettergevoelig (ignoreCase is false). De waarde van de vlag kan vervolgens worden geëvalueerd in een voorwaardelijke verklaring.
In het volgende voorbeeld wordt een eenvoudige console-app gebruikt om het gebruik van Booleaanse variabelen als vlaggen te illustreren. De app accepteert opdrachtregelparameters waarmee uitvoer kan worden omgeleid naar een opgegeven bestand (de /f-switch) en waarmee uitvoer kan worden verzonden naar een opgegeven bestand en naar de console (de /b-switch). De app definieert een vlag met de naam isRedirected om aan te geven of uitvoer naar een bestand moet worden verzonden en een vlag met de naam isBoth om aan te geven dat de uitvoer naar de console moet worden verzonden. In het F#-voorbeeld wordt een recursieve functie gebruikt om de argumenten te parseren.
using System;
using System.IO;
using System.Threading;
public class Example5
{
public static void Main()
{
// Initialize flag variables.
bool isRedirected = false;
bool isBoth = false;
String fileName = "";
StreamWriter sw = null;
// Get any command line arguments.
String[] args = Environment.GetCommandLineArgs();
// Handle any arguments.
if (args.Length > 1) {
for (int ctr = 1; ctr < args.Length; ctr++) {
String arg = args[ctr];
if (arg.StartsWith("/") || arg.StartsWith("-")) {
switch (arg.Substring(1).ToLower())
{
case "f":
isRedirected = true;
if (args.Length < ctr + 2) {
ShowSyntax("The /f switch must be followed by a filename.");
return;
}
fileName = args[ctr + 1];
ctr++;
break;
case "b":
isBoth = true;
break;
default:
ShowSyntax(String.Format("The {0} switch is not supported",
args[ctr]));
return;
}
}
}
}
// If isBoth is True, isRedirected must be True.
if (isBoth && ! isRedirected) {
ShowSyntax("The /f switch must be used if /b is used.");
return;
}
// Handle output.
if (isRedirected) {
sw = new StreamWriter(fileName);
if (!isBoth)
Console.SetOut(sw);
}
String msg = String.Format("Application began at {0}", DateTime.Now);
Console.WriteLine(msg);
if (isBoth) sw.WriteLine(msg);
Thread.Sleep(5000);
msg = String.Format("Application ended normally at {0}", DateTime.Now);
Console.WriteLine(msg);
if (isBoth) sw.WriteLine(msg);
if (isRedirected) sw.Close();
}
private static void ShowSyntax(String errMsg)
{
Console.WriteLine(errMsg);
Console.WriteLine("\nSyntax: Example [[/f <filename> [/b]]\n");
}
}
open System
open System.IO
open System.Threading
let showSyntax errMsg =
printfn $"{errMsg}\n\nSyntax: Example [[/f <filename> [/b]]\n"
let mutable isRedirected = false
let mutable isBoth = false
let mutable fileName = ""
let rec parse = function
| [] -> ()
| "-b" :: rest
| "/b" :: rest ->
isBoth <- true
// Parse remaining arguments.
parse rest
| "-f" :: file :: rest
| "/f" :: file :: rest ->
isRedirected <- true
fileName <- file
// Parse remaining arguments.
parse rest
| "-f" :: []
| "/f" :: [] ->
isRedirected <- true
// No more arguments to parse.
| x -> showSyntax $"The {x} switch is not supported"
Environment.GetCommandLineArgs()[1..]
|> List.ofArray
|> parse
// If isBoth is True, isRedirected must be True.
if isBoth && not isRedirected then
showSyntax "The /f switch must be used if /b is used."
// If isRedirected is True, a fileName must be specified.
elif fileName = "" && isRedirected then
showSyntax "The /f switch must be followed by a filename."
else
use mutable sw = null
// Handle output.
let writeLine =
if isRedirected then
sw <- new StreamWriter(fileName)
if isBoth then
fun text ->
printfn "%s" text
sw.WriteLine text
else sw.WriteLine
else printfn "%s"
writeLine $"Application began at {DateTime.Now}"
Thread.Sleep 5000
writeLine $"Application ended normally at {DateTime.Now}"
Imports System.IO
Imports System.Threading
Module Example5
Public Sub Main()
' Initialize flag variables.
Dim isRedirected, isBoth As Boolean
Dim fileName As String = ""
Dim sw As StreamWriter = Nothing
' Get any command line arguments.
Dim args() As String = Environment.GetCommandLineArgs()
' Handle any arguments.
If args.Length > 1 Then
For ctr = 1 To args.Length - 1
Dim arg As String = args(ctr)
If arg.StartsWith("/") OrElse arg.StartsWith("-") Then
Select Case arg.Substring(1).ToLower()
Case "f"
isRedirected = True
If args.Length < ctr + 2 Then
ShowSyntax("The /f switch must be followed by a filename.")
Exit Sub
End If
fileName = args(ctr + 1)
ctr += 1
Case "b"
isBoth = True
Case Else
ShowSyntax(String.Format("The {0} switch is not supported",
args(ctr)))
Exit Sub
End Select
End If
Next
End If
' If isBoth is True, isRedirected must be True.
If isBoth And Not isRedirected Then
ShowSyntax("The /f switch must be used if /b is used.")
Exit Sub
End If
' Handle output.
If isRedirected Then
sw = New StreamWriter(fileName)
If Not isBoth Then
Console.SetOut(sw)
End If
End If
Dim msg As String = String.Format("Application began at {0}", Date.Now)
Console.WriteLine(msg)
If isBoth Then sw.WriteLine(msg)
Thread.Sleep(5000)
msg = String.Format("Application ended normally at {0}", Date.Now)
Console.WriteLine(msg)
If isBoth Then sw.WriteLine(msg)
If isRedirected Then sw.Close()
End Sub
Private Sub ShowSyntax(errMsg As String)
Console.WriteLine(errMsg)
Console.WriteLine()
Console.WriteLine("Syntax: Example [[/f <filename> [/b]]")
Console.WriteLine()
End Sub
End Module
Booleaanse en rekenkundige bewerkingen
Een Booleaanse waarde wordt soms gebruikt om de aanwezigheid aan te geven van een voorwaarde die een wiskundige berekening activeert. Een variabele hasShippingCharge kan bijvoorbeeld fungeren als vlag om aan te geven of er verzendkosten moeten worden toegevoegd aan een factuurbedrag.
Omdat een bewerking met een false waarde geen effect heeft op het resultaat van een bewerking, is het niet nodig om de Booleaanse waarde te converteren naar een integrale waarde die in de wiskundige bewerking moet worden gebruikt. In plaats daarvan kunt u voorwaardelijke logica gebruiken.
In het volgende voorbeeld wordt een bedrag berekend dat bestaat uit een subtotaal, een verzendkosten en een optionele servicekosten. De hasServiceCharge variabele bepaalt of de servicekosten worden toegepast. In plaats van hasServiceCharge te converteren naar een numerieke waarde en deze te vermenigvuldigen met het bedrag van de servicekosten, gebruikt het voorbeeld voorwaardelijke logica om het servicekostenbedrag toe te voegen als dit van toepassing is.
using System;
public class Example6
{
public static void Main()
{
bool[] hasServiceCharges = { true, false };
Decimal subtotal = 120.62m;
Decimal shippingCharge = 2.50m;
Decimal serviceCharge = 5.00m;
foreach (var hasServiceCharge in hasServiceCharges) {
Decimal total = subtotal + shippingCharge +
(hasServiceCharge ? serviceCharge : 0);
Console.WriteLine($"hasServiceCharge = {hasServiceCharge}: The total is {total:C2}.");
}
}
}
// The example displays output like the following:
// hasServiceCharge = True: The total is $128.12.
// hasServiceCharge = False: The total is $123.12.
let hasServiceCharges = [ true; false ]
let subtotal = 120.62M
let shippingCharge = 2.50M
let serviceCharge = 5.00M
for hasServiceCharge in hasServiceCharges do
let total =
subtotal + shippingCharge + if hasServiceCharge then serviceCharge else 0M
printfn $"hasServiceCharge = {hasServiceCharge}: The total is {total:C2}."
// The example displays output like the following:
// hasServiceCharge = True: The total is $128.12.
// hasServiceCharge = False: The total is $123.12.
Module Example6
Public Sub Main()
Dim hasServiceCharges() As Boolean = {True, False}
Dim subtotal As Decimal = 120.62D
Dim shippingCharge As Decimal = 2.5D
Dim serviceCharge As Decimal = 5D
For Each hasServiceCharge In hasServiceCharges
Dim total As Decimal = subtotal + shippingCharge +
If(hasServiceCharge, serviceCharge, 0)
Console.WriteLine("hasServiceCharge = {1}: The total is {0:C2}.",
total, hasServiceCharge)
Next
End Sub
End Module
' The example displays output like the following:
' hasServiceCharge = True: The total is $128.12.
' hasServiceCharge = False: The total is $123.12.
Booleans en interoperabiliteit
Hoewel het marshalen van basisgegevenssoorten naar COM over het algemeen eenvoudig is, is het Boolean-gegevenstype een uitzondering. U kunt het kenmerk MarshalAsAttribute toepassen om het Boolean-type te marshalen naar een van de volgende weergaven:
| Opsommingstype | Niet-beheerde indeling |
|---|---|
| UnmanagedType.Bool | Een geheel getal van 4 bytes, waarbij een niet-nulwaarde true en 0 falsevertegenwoordigt. Dit is de standaardindeling van een Boolean veld in een structuur en van een Boolean parameter in aanroepen van het platform. |
| UnmanagedType.U1 | Een geheel getal van 1 bytes, waarbij de 1 true en 0 falsevertegenwoordigt. |
| UnmanagedType.VariantBool | Een geheel getal van 2 bytes, waarbij -1 true en 0 falsevertegenwoordigt. Dit is de standaardindeling van een Boolean parameter in COM-interop-aanroepen. |