Boolean Struktura
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Představuje logickou hodnotu ( true
false
nebo ).
public value class bool : IComparable, IComparable<bool>, IConvertible, IEquatable<bool>
public value class bool : IComparable, IConvertible
public value class bool : IComparable, IComparable<bool>, IEquatable<bool>
public struct Boolean : IComparable, IComparable<bool>, IConvertible, IEquatable<bool>
[System.Serializable]
public struct Boolean : IComparable, IConvertible
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public struct Boolean : IComparable, IComparable<bool>, IConvertible, IEquatable<bool>
public struct Boolean : IComparable, IComparable<bool>, IEquatable<bool>
type bool = struct
interface IConvertible
[<System.Serializable>]
type bool = struct
interface IConvertible
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type bool = struct
interface IConvertible
type bool = struct
Public Structure Boolean
Implements IComparable, IComparable(Of Boolean), IConvertible, IEquatable(Of Boolean)
Public Structure Boolean
Implements IComparable, IConvertible
Public Structure Boolean
Implements IComparable, IComparable(Of Boolean), IEquatable(Of Boolean)
- Dědičnost
- Atributy
- Implementuje
Poznámky
Instance Boolean může mít jednu ze dvou hodnot: nebo true
false
.
Struktura Boolean poskytuje metody, které podporují následující úlohy:
Převod logických hodnot na řetězce: ToString
Parsování řetězců pro jejich převod na logické Parse hodnoty: a TryParse
Následující části popisují tyto úlohy a další podrobnosti o využití:
- Formátování logických hodnot
- Převod na logické hodnoty a z logických hodnot
- Parsovat logické hodnoty
- Porovnání logických hodnot
- Práce s logickými hodnotami jako s binárními hodnotami
- Provádění operací s logickými hodnotami
- Logické hodnoty a interoperabilita
Formátování logických hodnot
Řetězcová reprezentace Boolean je buď "True" pro hodnotu, nebo true
"False" pro false
hodnotu. Řetězcové vyjádření hodnoty je definováno poli jen pro čtení a Boolean TrueString FalseString .
K ToString převodu logických hodnot na řetězce použijete metodu . Logická struktura zahrnuje dvě přetížení: metodu bez parametrů a metodu , která zahrnuje ToString ToString() ToString(IFormatProvider) parametr, který řídí formátování. Vzhledem k tomu, že je tento parametr ignorován, vytvoří tato dvě přetížení identické řetězce. Metoda ToString(IFormatProvider) nepodporuje formátování citlivé na jazykovou verzi.
Následující příklad znázorňuje formátování pomocí ToString metody . Všimněte si, že v příkladu se používá funkce složeného formátování, takže ToString metoda se volá implicitně.
using System;
public class Example
{
public static void Main()
{
bool raining = false;
bool busLate = true;
Console.WriteLine("It is raining: {0}", raining);
Console.WriteLine("The bus is late: {0}", busLate);
}
}
// The example displays the following output:
// It is raining: False
// The bus is late: True
Module Example
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
Vzhledem k Boolean tomu, že struktura může mít pouze dvě hodnoty, je snadné přidat vlastní formátování. Pro jednoduché vlastní formátování, ve kterém se nahradí jiné řetězcové literály za "True" a "False", můžete použít libovolnou funkci podmíněného vyhodnocení podporovanou vaším jazykem, například podmíněný operátor v jazyce C# nebo operátor If v Visual Basic. Následující příklad používá tuto techniku k formátování hodnot Boolean jako "Ano" a "Ne" místo "True" a "False".
using System;
public class Example
{
public static void Main()
{
bool raining = false;
bool busLate = true;
Console.WriteLine("It is raining: {0}",
raining ? "Yes" : "No");
Console.WriteLine("The bus is late: {0}",
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
Pro složitější operace vlastního formátování, včetně formátování citlivého na jazykovou verzi, můžete volat metodu String.Format(IFormatProvider, String, Object[]) a poskytnout ICustomFormatter implementaci. Následující příklad implementuje rozhraní a pro poskytování logických řetězců citlivých na jazykovou verzi pro jazykovou verzi (USA), francouzštinu (Francie) a ruštinu ICustomFormatter IFormatProvider (Rusko).
using System;
using System.Globalization;
public class Example
{
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': верно
Imports System.Globalization
Module Example
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': верно
Volitelně můžete použít soubory prostředků k definování logických řetězců specifických pro jazykovou verzi.
Převod na logické hodnoty a z logických hodnot
Struktura Boolean implementuje IConvertible rozhraní . V důsledku toho můžete použít třídu k provedení převodů mezi hodnotou a jiným primitivním typem v rozhraní .NET, nebo můžete volat explicitní Convert Boolean implementace Boolean struktury. Převody mezi a následující typy však nejsou podporovány, takže odpovídající metody převodu Boolean vyvolá InvalidCastException výjimku:
Převod mezi Boolean a Char Convert.ToBoolean(Char) (metody Convert.ToChar(Boolean) a)
Převod mezi Boolean a DateTime Convert.ToBoolean(DateTime) (metody Convert.ToDateTime(Boolean) a)
Všechny převody z integrálních čísel nebo čísel s plovoucí desetinnou čárkou na logické hodnoty převádí nenulové hodnoty na a true
nulové hodnoty na false
. Následující příklad to znázorňuje voláním vybraných přetížení Convert.ToBoolean třídy.
using System;
public class Example
{
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
Module Example
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 = .0001
Console.WriteLine(Convert.ToBoolean(sngValue))
End Sub
End Module
' The example displays the following output:
' True
' False
' True
' True
' True
' False
' True
Při převodu z logických na číselné hodnoty se metody převodu třídy převádí na 1 a Convert true
na false
0. Funkce převodu Visual Basic ale převést na 255 (pro převody na hodnoty) nebo true
Byte -1 (pro všechny ostatní číselné převody). Následující příklad se převede na číselné hodnoty pomocí metody a v případě Visual Basic například pomocí vlastního operátoru převodu Visual Basic true
Convert jazyka.
using System;
public class Example
{
public static void Main()
{
bool flag = true;
byte byteValue;
byteValue = Convert.ToByte(flag);
Console.WriteLine("{0} -> {1}", flag, byteValue);
sbyte sbyteValue;
sbyteValue = Convert.ToSByte(flag);
Console.WriteLine("{0} -> {1}", flag, sbyteValue);
double dblValue;
dblValue = Convert.ToDouble(flag);
Console.WriteLine("{0} -> {1}", flag, dblValue);
int intValue;
intValue = Convert.ToInt32(flag);
Console.WriteLine("{0} -> {1}", flag, intValue);
}
}
// The example displays the following output:
// True -> 1
// True -> 1
// True -> 1
// True -> 1
Module Example
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)
Převody z Boolean na řetězcové hodnoty najdete v části Formátování logických hodnot. Převody z řetězců na Boolean hodnoty najdete v části Analýza logických hodnot.
Parsovat logické hodnoty
Struktura Boolean obsahuje dvě statické metody analýzy a , které Parse TryParse převádí řetězec na logickou hodnotu. Řetězcové vyjádření logické hodnoty je definováno ekvivalenty hodnot polí a , které jsou True a False, bez rozlišení velkých a malých TrueString FalseString písmen. Jinými slovy, jedinými řetězci, které se úspěšně parsuje, jsou "True", "False", "true", "false" nebo jiné ekvivalenty s kombinovanými případy. Nemůžete úspěšně analyzovat číselné řetězce, jako jsou "0" nebo "1". Úvodní ani koncové prázdné znaky se při porovnávání řetězců nezovažují.
Následující příklad používá metody Parse a k analýze počtu TryParse řetězců. Všimněte si, že je možné úspěšně parsovat pouze ekvivalenty "True" a "False" bez rozlišení velkých a malých písmen.
using System;
public class Example
{
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("'{0}' --> {1}", value, flag);
}
catch (ArgumentException) {
Console.WriteLine("Cannot parse a null string.");
}
catch (FormatException) {
Console.WriteLine("Cannot parse '{0}'.", 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("'{0}' --> {1}", value, flag);
else
Console.WriteLine("Unable to parse '{0}'", 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 Example
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)
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'
Pokud program používáte Visual Basic, můžete pomocí funkce převést řetězcové vyjádření čísla CBool
na logickou hodnotu. "0" je převedeno na a řetězcové vyjádření jakékoli false
nenulové hodnoty je převedeno na true
. Pokud neprogramováváte v Visual Basic, musíte před převodem na logickou hodnotu převést číselný řetězec na číslo. Následující příklad to znázorňuje převodem pole celých čísel na logické hodnoty.
using System;
public class Example
{
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 '{0}' to {1}", value, result);
}
else {
Console.WriteLine("Unable to convert '{0}'", 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 Example
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
Porovnání logických hodnot
Vzhledem k tomu, že logické hodnoty jsou buď nebo , neexistuje žádný důvod explicitně volat metodu , která označuje, zda je instance větší než, menší než nebo rovna true
false
zadané CompareTo hodnotě. Pokud chcete porovnat dvě logické proměnné, obvykle zavoláte metodu nebo použijete operátor Equals rovnosti jazyka.
Pokud však chcete porovnat logickou proměnnou s literálovou logickou hodnotou nebo , není nutné provést explicitní porovnání, protože výsledkem vyhodnocení logické hodnoty je tato true
false
logická hodnota. Například výrazy
if (booleanValue == true) {
If booleanValue = True Then
a
if (booleanValue) {
If booleanValue Then
jsou ekvivalentní, ale druhý je kompaktnější. Obě techniky ale nabízejí srovnatelný výkon.
Práce s logickými hodnotami jako s binárními hodnotami
Logická hodnota zabírá jeden byte paměti, jak ukazuje následující příklad jazyka C#. Příklad musí být zkompilován pomocí /unsafe
přepínače .
using System;
public struct BoolStruct
{
public bool flag1;
public bool flag2;
public bool flag3;
public bool flag4;
public bool flag5;
}
public class Example
{
public static void Main()
{
unsafe {
BoolStruct b = new BoolStruct();
bool* addr = (bool*) &b;
Console.WriteLine("Size of BoolStruct: {0}", sizeof(BoolStruct));
Console.WriteLine("Field offsets:");
Console.WriteLine(" flag1: {0}", (bool*) &b.flag1 - addr);
Console.WriteLine(" flag1: {0}", (bool*) &b.flag2 - addr);
Console.WriteLine(" flag1: {0}", (bool*) &b.flag3 - addr);
Console.WriteLine(" flag1: {0}", (bool*) &b.flag4 - addr);
Console.WriteLine(" flag1: {0}", (bool*) &b.flag5 - addr);
}
}
}
// The example displays the following output:
// Size of BoolStruct: 5
// Field offsets:
// flag1: 0
// flag1: 1
// flag1: 2
// flag1: 3
// flag1: 4
Bit v nízkém pořadí se používá k reprezentaci jeho hodnoty. Hodnota 1 představuje true
; hodnota 0 představuje hodnotu false
.
Tip
Tuto strukturu můžete použít System.Collections.Specialized.BitVector32 pro práci se sadami logických hodnot.
Logickou hodnotu můžete převést na její binární reprezentaci voláním BitConverter.GetBytes(Boolean) metody . Metoda vrátí pole bajtů s jedním prvkem. Pokud chcete obnovit logickou hodnotu ze své binární reprezentace, můžete zavolat BitConverter.ToBoolean(Byte[], Int32) metodu .
Následující příklad volá metodu , která převede logickou hodnotu na její binární reprezentaci, zobrazí jednotlivé bity hodnoty a potom zavolá metodu pro obnovení hodnoty ze své BitConverter.GetBytes BitConverter.ToBoolean binární reprezentace.
using System;
public class Example
{
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: {0}", flag);
Console.WriteLine("Binary value: {0} ({1})", value,
GetBinaryString(value));
// Restore the flag from its binary representation.
bool newFlag = BitConverter.ToBoolean( new Byte[] { value }, 0);
Console.WriteLine("Restored value: {0}\n", flag);
}
}
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
Module Example
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}", flag)
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
Provádění operací s logickými hodnotami
Tato část ukazuje, jak se v aplikacích používají logické hodnoty. První část popisuje jeho použití jako příznak. Druhý znázorňuje použití pro aritmetické operace.
Logické hodnoty jako příznaky
Logické proměnné se nejčastěji používají jako příznaky k signálu přítomnosti nebo absenci určité podmínky. Například v metodě je posledním parametrem příznak , který určuje, jestli se při porovnání dvou řetězců rozlišují malá a velká písmena ( je ) nebo jestli se rozlišují malá a velká písmena String.Compare(String, String, Boolean) ignoreCase
( je ignoreCase
true
ignoreCase
false
). Hodnotu příznaku je pak možné vyhodnotit v podmíněném příkazu.
Následující příklad používá jednoduchou konzolovou aplikaci k ilustraci použití logických proměnných jako příznaků. Aplikace přijímá parametry příkazového řádku, které umožňují přesměrování výstupu do zadaného souboru (přepínače) a které umožňují odeslání výstupu do zadaného souboru i do konzoly /f
/b
(přepínač). Aplikace definuje příznak s názvem , který určuje, jestli se má výstup odeslat do souboru, a příznak s názvem , který označuje, že se má výstup odeslat isRedirected
isBoth
do konzoly.
using System;
using System.IO;
using System.Threading;
public class Example
{
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");
}
}
Imports System.IO
Imports System.Threading
Module Example
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
Logické hodnoty a aritmetické operace
Logická hodnota se někdy používá k označení přítomnosti podmínky, která aktivuje matematický výpočet. Proměnná může například sloužit jako příznak, který označuje, jestli se mají k částce faktury přidat poplatky hasShippingCharge
za expedici.
Vzhledem k tomu, že operace s hodnotou nemá žádný vliv na výsledek operace, není nutné převést logickou hodnotu na celočíselnou hodnotu, která se použije v false
matematické operaci. Místo toho můžete použít podmíněnou logiku.
Následující příklad vypočítá množství, které se skládá z mezisoučtu, poplatku za expedici a volitelného poplatku za službu. Proměnná hasServiceCharge
určuje, jestli se použije poplatek za službu. Místo převodu na číselnou hodnotu a vynásobení částkou poplatku za službu se v příkladu používá podmíněná logika, která přidá částku poplatku za službu, pokud hasServiceCharge
je k dispozici.
using System;
public class Example
{
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 = {1}: The total is {0:C2}.",
total, hasServiceCharge);
}
}
}
// The example displays output like the following:
// hasServiceCharge = True: The total is $128.12.
// hasServiceCharge = False: The total is $123.12.
Module Example
Public Sub Main()
Dim hasServiceCharges() As Boolean = { True, False }
Dim subtotal As Decimal = 120.62d
Dim shippingCharge As Decimal = 2.50d
Dim serviceCharge As Decimal = 5.00d
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.
Logické hodnoty a interoperabilita
I když je zařazování základních datových typů do modelu COM obecně jednoduché, datový Boolean typ je výjimka. Atribut můžete použít MarshalAsAttribute k zařazování Boolean typu na libovolnou z následujících reprezentací:
Typ výčtu | Nespravovaný formát |
---|---|
UnmanagedType.Bool | 4bitové celočíselné hodnoty, kde jakákoli nenulová hodnota představuje a true 0 představuje false . Toto je výchozí formát pole Boolean ve struktuře a Boolean parametru ve voláních vyvolání platformy. |
UnmanagedType.U1 | Celočíselná hodnota o 1 byte, kde 1 představuje a true 0 představuje false . |
UnmanagedType.VariantBool | 2bitové celočíselné hodnoty, kde -1 představuje a true 0 představuje false . Toto je výchozí formát parametru Boolean ve volání zprostředkovatele komunikace s objekty COM. |
Pole
FalseString |
Představuje logickou hodnotu |
TrueString |
Představuje logickou hodnotu |
Metody
CompareTo(Boolean) |
Porovná tuto instanci se zadaným objektem a vrátí celé číslo, které označuje jejich Boolean vztah mezi sebou. |
CompareTo(Object) |
Porovná tuto instanci se zadaným objektem a vrátí celé číslo, které označuje jejich vztah mezi sebou. |
Equals(Boolean) |
Vrátí hodnotu určující, zda je tato instance rovna zadanému Boolean objektu. |
Equals(Object) |
Vrací hodnotu, která určuje, zda je tato instance rovna zadanému objektu. |
GetHashCode() |
Vrátí hodnotu hash pro tuto instanci. |
GetTypeCode() |
Vrátí kód typu pro Boolean typ hodnoty. |
Parse(ReadOnlySpan<Char>) |
Převede zadanou reprezentaci rozsahu logické hodnoty na její Boolean ekvivalent. |
Parse(String) |
Převede zadanou řetězcovou reprezentaci logické hodnoty na její Boolean ekvivalent. |
ToString() |
Převede hodnotu této instance na odpovídající řetězcovou reprezentaci (True nebo False). |
ToString(IFormatProvider) |
Převede hodnotu této instance na odpovídající řetězcovou reprezentaci (True nebo False). |
TryFormat(Span<Char>, Int32) |
Pokusí se naformátovat hodnotu aktuální logické instance do zadaného rozsahu znaků. |
TryParse(ReadOnlySpan<Char>, Boolean) |
Pokusí se převést určený rozsah reprezentace logické hodnoty na její Boolean ekvivalent. |
TryParse(String, Boolean) |
Pokusí se převést zadanou řetězcovou reprezentaci logické hodnoty na její Boolean ekvivalent. |
Explicitní implementace rozhraní
Platí pro
Bezpečný přístup z více vláken
Všechny členy tohoto typu jsou zabezpečeny pro přístup z více vláken. Členy, které patrně upravují stav instance, ve skutečnosti vrací novou instanci inicializovanou s použitím nové hodnoty. Jako u jakéhokoli typu, čtení a zápis do sdílené proměnné, která obsahuje instanci tohoto typu, musí být chráněn zámkem, který zaručí bezpečný přístup z více vláken.