Cómo manejar la verificación de nulos para operaciones de códigos de barras en C
IronBarcode devuelve los resultados del escaneo como una colección BarcodeResults en C# a través de BarcodeReader.Read. Este método devuelve null si no se reconoce la imagen de entrada, o una colección vacía si no se detectan BarCodes. BarcodeWriter.CreateBarcode lanza una excepción si la entrada es nula, está vacía o tiene un formato no válido.
Las fuentes de escaneo del mundo real, como las imágenes de cámaras, las subidas de documentos y los escáneres de almacén, pueden no proporcionar siempre un BARCODE legible. Acceder a las propiedades del resultado o iterar por la colección sin comprobar si hay valores nulos o vacíos puede provocar un NullReferenceException en tiempo de ejecución. Pasar cadenas no válidas a la API de escritura puede dar lugar a una excepción ArgumentException. El uso de cláusulas de protección tanto en operaciones de lectura como de escritura ayuda a prevenir estas excepciones en producción.
Este tutorial explica cómo gestionar los resultados nulos y vacíos en las operaciones de lectura y escritura de IronBarcode mediante el uso de cláusulas de protección, filtrado de confianza y un patrón de validador reutilizable.
Inicio rápido: Manejar resultados nulos en operaciones de códigos de barras
Utilice el patrón de protección de IronBarcode para comprobar de forma segura la colección BarcodeResults antes de acceder a cualquier propiedad de los resultados. Empiece de inmediato con esta breve lectura y revisión:
-
Instala IronBarcode con el Administrador de Paquetes NuGet
PM > Install-Package BarCode -
Copie y ejecute este fragmento de código.
using IronBarCode; BarcodeResults results = BarcodeReader.Read("label.png"); // Guard: null or empty if (results is null || results.Count == 0) { Console.WriteLine("No barcodes detected."); return; } Console.WriteLine(results.First().Value); -
Despliegue para probar en su entorno real
Comienza a usar IronBarcode en tu proyecto hoy mismo con una prueba gratuita
Cómo gestionar la comprobación de valores nulos en operaciones con códigos de barras con IronBarcode
- Descargar la biblioteca IronBarcode desde NuGet
- Llame a
BarcodeReader.Ready capture el resultado devuelto porBarcodeResults - Compruebe si hay valores nulos antes de acceder a cualquier resultado
- Valide las propiedades individuales
de BarcodeResultantes de su uso posterior - Establezca
ConfidenceThresholdenBarcodeReaderOptionspara filtrar lecturas de baja calidad en el nivel de escaneo
¿Cómo manejar resultados de código de barras nulos y vacíos?
Hay dos modos de fallo: BarcodeResults es nulo si la entrada no es una imagen válida, y está vacío si la imagen no contiene BarCodes. Acceder a First, Value o iterar sin verificar ambas condiciones provocará una excepción en tiempo de ejecución.
Compruebe ambas condiciones antes de entrar en el bucle de procesamiento:
Entrada
Una etiqueta de envío con BarCode Code128 (ruta de éxito) y una imagen en blanco sin BarCode (ruta de error).
shipping-label.png (ruta de éxito)
blank-image.png (ruta de error, no hay BarCode)
:path=/static-assets/barcode/content-code-examples/how-to/null-checking/null-guard.cs
using IronBarCode;
// BarcodeReader.Read() returns a BarcodeResults collection, not a single result
BarcodeResults results = BarcodeReader.Read("shipping-label.png");
// Null check: image was not recognized as a valid image source
// Empty check: image was valid but contained no detectable barcodes
if (results is null || results.Count == 0)
{
// Log, return a default, or throw a domain-specific exception
Console.WriteLine("No barcodes found in the input image.");
return;
}
// Collection is safe to iterate; each BarcodeResult holds one decoded barcode
foreach (BarcodeResult result in results)
{
// Guard individual result properties; partial scans or severely
// damaged barcodes can produce results where .Value is empty or whitespace
if (string.IsNullOrWhiteSpace(result.Value))
{
Console.WriteLine($"Empty value detected for {result.BarcodeType}");
continue;
}
// BarcodeType identifies the symbology (Code128, QRCode, EAN8, etc.)
Console.WriteLine($"Type: {result.BarcodeType}, Value: {result.Value}");
}
Imports IronBarCode
' BarcodeReader.Read() returns a BarcodeResults collection, not a single result
Dim results As BarcodeResults = BarcodeReader.Read("shipping-label.png")
' Null check: image was not recognized as a valid image source
' Empty check: image was valid but contained no detectable barcodes
If results Is Nothing OrElse results.Count = 0 Then
' Log, return a default, or throw a domain-specific exception
Console.WriteLine("No barcodes found in the input image.")
Return
End If
' Collection is safe to iterate; each BarcodeResult holds one decoded barcode
For Each result As BarcodeResult In results
' Guard individual result properties; partial scans or severely
' damaged barcodes can produce results where .Value is empty or whitespace
If String.IsNullOrWhiteSpace(result.Value) Then
Console.WriteLine($"Empty value detected for {result.BarcodeType}")
Continue For
End If
' BarcodeType identifies the symbology (Code128, QRCode, EAN8, etc.)
Console.WriteLine($"Type: {result.BarcodeType}, Value: {result.Value}")
Next
Cada BarcodeResult proporciona las propiedades de cadena Value y Text, que devuelven el contenido descodificado del BARCODE. Los Barcodes muy dañados o los escaneos parciales pueden generar valores vacíos o espacios en blanco. Utilice string.IsNullOrWhiteSpace en cada resultado para evitar que los valores vacíos lleguen a los sistemas posteriores.
BarcodeReaderOptions también tiene una propiedad ConfidenceThreshold (de 0,0 a 1,0) que descarta las lecturas de baja calidad antes de que lleguen a la colección de resultados:
:path=/static-assets/barcode/content-code-examples/how-to/null-checking/confidence-filter.cs
using IronBarCode;
// ConfidenceThreshold filters low-quality reads before they enter the
// BarcodeResults collection. Reads below the threshold are discarded
// during scanning, not after, so no post-filtering of the collection is needed.
var options = new BarcodeReaderOptions
{
ConfidenceThreshold = 0.7 // range 0.0 to 1.0; lower values accept weaker signals
};
BarcodeResults results = BarcodeReader.Read("shipping-label.png", options);
// Still check for null and empty even with a threshold applied;
// an image with no barcodes returns an empty collection, not null
if (results is null || results.Count == 0)
{
Console.WriteLine("No barcodes met the confidence threshold.");
return;
}
foreach (var result in results)
Console.WriteLine($"Type: {result.BarcodeType}, Value: {result.Value}");
Imports IronBarCode
' ConfidenceThreshold filters low-quality reads before they enter the
' BarcodeResults collection. Reads below the threshold are discarded
' during scanning, not after, so no post-filtering of the collection is needed.
Dim options As New BarcodeReaderOptions With {
.ConfidenceThreshold = 0.7 ' range 0.0 to 1.0; lower values accept weaker signals
}
Dim results As BarcodeResults = BarcodeReader.Read("shipping-label.png", options)
' Still check for null and empty even with a threshold applied;
' an image with no barcodes returns an empty collection, not null
If results Is Nothing OrElse results.Count = 0 Then
Console.WriteLine("No barcodes met the confidence threshold.")
Return
End If
For Each result In results
Console.WriteLine($"Type: {result.BarcodeType}, Value: {result.Value}")
Next
¿Cómo aplicar patrones seguros con nulos al escribir códigos de barras?
BarcodeWriter.CreateBarcode toma un valor de cadena y una enumeración BarcodeWriterEncoding o BarcodeEncoding. Pasar un valor nulo o una cadena vacía provoca un error inmediato. También se aplican restricciones de formato: EAN-8 admite de 7 a 8 dígitos numéricos, UPC-A admite de 11 a 12, y Code 128 tiene un límite de caracteres. La validación de la entrada antes de la llamada evita que estas excepciones se produzcan en la etapa de codificación:
:path=/static-assets/barcode/content-code-examples/how-to/null-checking/null-safe-write.cs
using IronBarCode;
// Input may arrive from user input, a database, or an API response
string inputValue = GetValueFromUserOrDatabase(); // Could be null
// Guard: null, empty, or whitespace input cannot produce a valid barcode
if (string.IsNullOrWhiteSpace(inputValue))
{
Console.WriteLine("Cannot generate barcode: input value is null or empty.");
return;
}
// Guard: format-specific constraints must be satisfied before encoding
// EAN-8 accepts exactly 7 or 8 numeric digits (the 8th is the check digit)
BarcodeWriterEncoding encoding = BarcodeWriterEncoding.EAN8;
if (encoding == BarcodeWriterEncoding.EAN8 && !System.Text.RegularExpressions.Regex.IsMatch(inputValue, @"^\d{7,8}$"))
{
Console.WriteLine("EAN-8 requires exactly 7 or 8 numeric digits.");
return;
}
// Input is validated; CreateBarcode will not throw for null or format mismatch
GeneratedBarcode barcode = BarcodeWriter.CreateBarcode(inputValue, encoding);
barcode.SaveAsPng("output-barcode.png");
Imports IronBarCode
' Input may arrive from user input, a database, or an API response
Dim inputValue As String = GetValueFromUserOrDatabase() ' Could be Nothing
' Guard: null, empty, or whitespace input cannot produce a valid barcode
If String.IsNullOrWhiteSpace(inputValue) Then
Console.WriteLine("Cannot generate barcode: input value is null or empty.")
Return
End If
' Guard: format-specific constraints must be satisfied before encoding
' EAN-8 accepts exactly 7 or 8 numeric digits (the 8th is the check digit)
Dim encoding As BarcodeWriterEncoding = BarcodeWriterEncoding.EAN8
If encoding = BarcodeWriterEncoding.EAN8 AndAlso Not System.Text.RegularExpressions.Regex.IsMatch(inputValue, "^\d{7,8}$") Then
Console.WriteLine("EAN-8 requires exactly 7 or 8 numeric digits.")
Return
End If
' Input is validated; CreateBarcode will not throw for null or format mismatch
Dim barcode As GeneratedBarcode = BarcodeWriter.CreateBarcode(inputValue, encoding)
barcode.SaveAsPng("output-barcode.png")
Resultado
Una entrada válida de 7 dígitos (1234567) genera un BARCODE EAN-8 escaneable. Las entradas nulas, vacías o no numéricas son detectadas por las cláusulas de protección y nunca llegan a la etapa de codificación.
La API de escritura también realiza su propia validación interna: comprueba las sumas de comprobación, verifica las restricciones de longitud y rechaza los caracteres no válidos para la codificación seleccionada. Las cláusulas de protección anteriores detectan los problemas antes, lo que permite al autor de la llamada controlar el mensaje de error y la ruta de recuperación. Para una lista completa de codificaciones soportadas y sus restricciones, vea el cómo crear un código de barras y la guía crear un código de barras a partir de datos.
¿Cómo validar resultados antes del procesamiento posterior?
Cuando los datos de los BarCode se introducen en otro sistema (una escritura en una base de datos, una llamada a una API, una impresora de etiquetas), resulta útil consolidar el recuento de resultados, la integridad de los valores y las comprobaciones de tipo en un único método reutilizable antes de pasar los datos:
Entrada
Un escaneo de BarCode Code128 en un almacén utilizado como objetivo de lectura para el validador.
:path=/static-assets/barcode/content-code-examples/how-to/null-checking/barcode-validator.cs
using IronBarCode;
using System.Collections.Generic;
using System.Linq;
// Reusable validation helper — consolidates null, empty, value, and
// expected-format checks into a single method. Returns an empty list
// (never null) so callers do not need to null-check the return value.
public static class BarcodeValidator
{
public static List<BarcodeResult> GetValidResults(
string imagePath,
BarcodeEncoding? expectedType = null,
double confidenceThreshold = 0.7)
{
// Apply confidence threshold at scan level via BarcodeReaderOptions
var options = new BarcodeReaderOptions
{
ConfidenceThreshold = confidenceThreshold
};
BarcodeResults results = BarcodeReader.Read(imagePath, options);
// Return empty list instead of null so callers never need to null-check the return value
if (results is null || results.Count == 0)
return new List<BarcodeResult>();
return results
.Where(r => !string.IsNullOrWhiteSpace(r.Value)) // skip results with empty decoded data
.Where(r => expectedType == null || r.BarcodeType == expectedType) // null accepts any symbology
.ToList();
}
}
// Usage: pass the image path and the symbology you expect
var validated = BarcodeValidator.GetValidResults(
"warehouse-scan.png",
expectedType: BarcodeEncoding.Code128,
confidenceThreshold: 0.7);
if (validated.Count == 0)
{
// No valid results; log the failure and skip downstream processing
return;
}
// All results have passed null, empty, type, and confidence checks
foreach (var barcode in validated)
{
SendToInventorySystem(barcode.Value, barcode.BarcodeType.ToString()); // placeholder for your downstream call
}
Imports IronBarCode
Imports System.Collections.Generic
Imports System.Linq
' Reusable validation helper — consolidates null, empty, value, and
' expected-format checks into a single method. Returns an empty list
' (never null) so callers do not need to null-check the return value.
Public Module BarcodeValidator
Public Function GetValidResults(
imagePath As String,
Optional expectedType As BarcodeEncoding? = Nothing,
Optional confidenceThreshold As Double = 0.7) As List(Of BarcodeResult)
' Apply confidence threshold at scan level via BarcodeReaderOptions
Dim options As New BarcodeReaderOptions With {
.ConfidenceThreshold = confidenceThreshold
}
Dim results As BarcodeResults = BarcodeReader.Read(imagePath, options)
' Return empty list instead of null so callers never need to null-check the return value
If results Is Nothing OrElse results.Count = 0 Then
Return New List(Of BarcodeResult)()
End If
Return results _
.Where(Function(r) Not String.IsNullOrWhiteSpace(r.Value)) _ ' skip results with empty decoded data
.Where(Function(r) expectedType Is Nothing OrElse r.BarcodeType = expectedType) _ ' null accepts any symbology
.ToList()
End Function
End Module
' Usage: pass the image path and the symbology you expect
Dim validated = BarcodeValidator.GetValidResults(
"warehouse-scan.png",
expectedType:=BarcodeEncoding.Code128,
confidenceThreshold:=0.7)
If validated.Count = 0 Then
' No valid results; log the failure and skip downstream processing
Return
End If
' All results have passed null, empty, type, and confidence checks
For Each barcode In validated
SendToInventorySystem(barcode.Value, barcode.BarcodeType.ToString()) ' placeholder for your downstream call
Next barcode
El método devuelve una lista vacía en lugar de null, por lo que los usuarios nunca tienen que comprobar si el valor devuelto es null. El parámetro opcional expectedType filtra por simbología, lo que evita que el sistema posterior reciba formatos inesperados cuando un escáner detecta tanto un código QR como un Código 128 en la misma imagen.
Para la lectura por lotes de varios archivos, aplique el mismo patrón por archivo y agregue los resultados. La opción ExpectBarcodeTypes en BarcodeReaderOptions limita el escaneo a las simbologías esperadas desde el principio, por lo que llegan menos resultados no deseados al validador.
Más información
- Tutorial de lectura de BarCodes: configuración del escáner y opciones de lectura.
- Guía de formatos de datos de salida: todas las propiedades
BarcodeResulty sus tipos. - Crear BarCode a partir de datos: restricciones de codificación para cada simbología.
- Referencia de la API de BarcodeReaderOptions: documentación completa de configuración.
- Registro de cambios de IronBarcode: correcciones específicas de la versión y nuevas funciones.
Consulte las opciones de licencia cuando el proceso esté listo para la producción.
Preguntas Frecuentes
¿Qué es la verificación de nulos en operaciones de códigos de barras?
La verificación de nulos en operaciones de códigos de barras implica verificar si un resultado o entrada de código de barras es nulo para prevenir errores de ejecución y asegurar un procesamiento fluido de códigos de barras.
¿Por qué es importante la verificación de nulos en operaciones de códigos de barras en C#?
La verificación de nulos es crucial en operaciones de códigos de barras en C# para evitar excepciones y asegurar que la aplicación pueda manejar con gracia los casos donde los datos del código de barras puedan faltar o ser inválidos.
¿Cómo puede IronBarcode asistir con la verificación de nulos?
IronBarcode proporciona métodos integrados para manejar fácilmente las verificaciones de nulos, permitiendo a los desarrolladores gestionar de manera segura los datos de códigos de barras sin implementar manualmente una lógica de validación compleja.
¿Cuáles son algunas prácticas recomendadas para la verificación de nulos en IronBarcode?
Las mejores prácticas incluyen verificar BarcodeResults para valores nulos, validar las entradas antes de procesarlas y usar filtros de confianza para asegurar resultados confiables en el escaneo de códigos de barras.
¿Puede IronBarcode filtrar resultados por confianza para evitar salidas nulas?
Sí, IronBarcode permite filtrar resultados de códigos de barras por niveles de confianza, lo que ayuda a reducir salidas nulas y asegura una alta precisión en la lectura de códigos de barras.
¿Hay alguna forma de validar las entradas de escritura usando IronBarcode?
IronBarcode permite la validación de las entradas de escritura para asegurar que los datos codificados en los códigos de barras sean correctos y completos, previniendo problemas durante la generación de códigos de barras.
¿Qué pasa si un resultado nulo de un código de barras no se maneja?
Si un resultado nulo de un código de barras no se maneja, puede llevar a excepciones en tiempo de ejecución y perturbar el flujo de la aplicación, causando posibles fallos o operaciones incorrectas.

