Cómo manejar la verificación de nulos para operaciones de códigos de barras en C#

This article was translated from English: Does it need improvement?
Translated
View the article in English

BarcodeReader.Read() devuelve una colección BarcodeResults — no un valor único. Esa colección puede ser nula si la imagen de entrada no es reconocida, o vacía si no se detectan códigos de barras. En el lado de escritura, BarcodeWriter.CreateBarcode() lanza una excepción cuando se le pasa una entrada nula o inválida. Ambos caminos necesitan cláusulas de protección antes de que el código toque las propiedades del resultado o genere una salida.

Esta guía cubre el manejo de resultados nulos y vacíos para las operaciones de lectura y escritura de IronBarcode — los patrones defensivos que evitan que NullReferenceException y ArgumentException lleguen a producción.

Inicio rápido: Manejar resultados nulos en operaciones de códigos de barras

Protege la colección BarcodeResults tanto para estados nulos como vacíos antes de acceder a cualquier propiedad del resultado para prevenir excepciones de tiempo de ejecución.

  1. Instala IronBarcode con el Administrador de Paquetes NuGet

    PM > Install-Package BarCode
  2. 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);
  3. Despliegue para probar en su entorno real

    Comienza a usar IronBarcode en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer

¿Cómo manejar resultados de código de barras nulos y vacíos?

BarcodeReader.Read() devuelve BarcodeResults, que es una colección de objetos BarcodeResult. Hay dos modos de fallo contra los que protegerse: la colección en sí es nula (la entrada no fue reconocida como una imagen válida), y la colección está vacía (imagen válida, pero no se encontraron códigos de barras). Acceder a .First(), .Value, o iterar sin verificar ambas condiciones resulta en una excepción de tiempo de ejecución.

El patrón estándar de protección verifica ambas condiciones antes de entrar en el bucle de procesamiento:

using IronBarCode;

BarcodeResults results = BarcodeReader.Read("shipping-label.png");

// Null check: image may not be recognized
// Empty check: image recognized but no barcodes found
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;
}

foreach (BarcodeResult result in results)
{
    // Guard individual result properties
    if (string.IsNullOrWhiteSpace(result.Value))
    {
        Console.WriteLine($"Empty value detected for {result.BarcodeType}");
        continue;
    }

    Console.WriteLine($"Type: {result.BarcodeType}, Value: {result.Value}");
}
using IronBarCode;

BarcodeResults results = BarcodeReader.Read("shipping-label.png");

// Null check: image may not be recognized
// Empty check: image recognized but no barcodes found
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;
}

foreach (BarcodeResult result in results)
{
    // Guard individual result properties
    if (string.IsNullOrWhiteSpace(result.Value))
    {
        Console.WriteLine($"Empty value detected for {result.BarcodeType}");
        continue;
    }

    Console.WriteLine($"Type: {result.BarcodeType}, Value: {result.Value}");
}
$vbLabelText   $csharpLabel

Cada BarcodeResult expone .Value y .Text como propiedades de cadena — ambas devuelven el contenido del código de barras decodificado. En operación normal estos están poblados, pero existen casos extremos: códigos de barras severamente dañados, escaneos parciales, o detecciones de baja confianza pueden producir resultados donde el valor está vacío o es un espacio en blanco. Verificar string.IsNullOrWhiteSpace() en resultados individuales detecta estos casos antes de que los datos se propaguen.

La propiedad .Confidence (un doble entre 0.0 y 1.0) proporciona una señal de calidad adicional. Para sistemas de producción, podemos combinar la verificación de nulo con un umbral de confianza:

double minimumConfidence = 0.7;

var validResults = results
    .Where(r => !string.IsNullOrWhiteSpace(r.Value) && r.Confidence >= minimumConfidence)
    .ToList();

if (validResults.Count == 0)
{
    Console.WriteLine("No barcodes met the confidence threshold.");
    return;
}
double minimumConfidence = 0.7;

var validResults = results
    .Where(r => !string.IsNullOrWhiteSpace(r.Value) && r.Confidence >= minimumConfidence)
    .ToList();

if (validResults.Count == 0)
{
    Console.WriteLine("No barcodes met the confidence threshold.");
    return;
}
$vbLabelText   $csharpLabel

La clase BarcodeReaderOptions también proporciona una propiedad MinimumConfidence que filtra a nivel de escaneo en lugar de post-procesamiento. Establecer esto en el objeto de opciones es más limpio para escenarios de escaneo por lotes de alto rendimiento.

¿Cómo aplicar patrones seguros con nulos al escribir códigos de barras?

BarcodeWriter.CreateBarcode() acepta un valor de cadena y un enum BarcodeWriterEncoding o BarcodeEncoding. Pasar una cadena nula o vacía lanza una excepción. Además, se aplican restricciones específicas de formato — EAN-8 requiere exactamente 7–8 dígitos numéricos, UPC-A requiere 11–12 dígitos, y Code 128 tiene un límite máximo de caracteres. Violar estas restricciones también lanza excepciones.

El patrón defensivo valida la entrada antes de llamar a CreateBarcode():

using IronBarCode;

string inputValue = GetValueFromUserOrDatabase(); // Could be null

// Guard: null, empty, or whitespace
if (string.IsNullOrWhiteSpace(inputValue))
{
    Console.WriteLine("Cannot generate barcode: input value is null or empty.");
    return;
}

// Guard: format-specific constraints (example: EAN-8 requires 7-8 digits)
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;
}

GeneratedBarcode barcode = BarcodeWriter.CreateBarcode(inputValue, encoding);
barcode.SaveAsPng("output-barcode.png");
using IronBarCode;

string inputValue = GetValueFromUserOrDatabase(); // Could be null

// Guard: null, empty, or whitespace
if (string.IsNullOrWhiteSpace(inputValue))
{
    Console.WriteLine("Cannot generate barcode: input value is null or empty.");
    return;
}

// Guard: format-specific constraints (example: EAN-8 requires 7-8 digits)
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;
}

GeneratedBarcode barcode = BarcodeWriter.CreateBarcode(inputValue, encoding);
barcode.SaveAsPng("output-barcode.png");
$vbLabelText   $csharpLabel

El API de escritura de IronBarcode realiza su propia validación interna — verifica sumas de verificación, verifica restricciones de longitud, y rechaza caracteres inválidos para la codificación seleccionada. Estas comprobaciones lanzan System.Exception con mensajes descriptivos. Las cláusulas de protección anteriores detectan problemas antes de que lleguen a la biblioteca, lo que nos da control sobre los mensajes de error y el flujo. 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 códigos de barras se alimentan a otro sistema — una escritura de base de datos, una llamada a la API, una impresora de etiquetas — necesitamos una puerta de validación que verifique el conteo de resultados, la integridad del valor individual y el tipo de código de barras antes de la transferencia. Esto consolida la lógica de verificación de nulos en un único método reutilizable.

using IronBarCode;
using System.Collections.Generic;
using System.Linq;

public static class BarcodeValidator
{
    public static List<BarcodeResult> GetValidResults(
        string imagePath,
        BarcodeEncoding? expectedType = null,
        double minimumConfidence = 0.7)
    {
        BarcodeResults results = BarcodeReader.Read(imagePath);

        if (results is null || results.Count == 0)
            return new List<BarcodeResult>();

        return results
            .Where(r => !string.IsNullOrWhiteSpace(r.Value))
            .Where(r => r.Confidence >= minimumConfidence)
            .Where(r => expectedType == null || r.BarcodeType == expectedType)
            .ToList();
    }
}

// Usage
var validated = BarcodeValidator.GetValidResults(
    "warehouse-scan.png",
    expectedType: BarcodeEncoding.Code128,
    minimumConfidence: 0.85);

if (validated.Count == 0)
{
    // No valid results — log and skip downstream processing
    return;
}

// Safe to pass to downstream systems
foreach (var barcode in validated)
{
    SendToInventorySystem(barcode.Value, barcode.BarcodeType.ToString());
}
using IronBarCode;
using System.Collections.Generic;
using System.Linq;

public static class BarcodeValidator
{
    public static List<BarcodeResult> GetValidResults(
        string imagePath,
        BarcodeEncoding? expectedType = null,
        double minimumConfidence = 0.7)
    {
        BarcodeResults results = BarcodeReader.Read(imagePath);

        if (results is null || results.Count == 0)
            return new List<BarcodeResult>();

        return results
            .Where(r => !string.IsNullOrWhiteSpace(r.Value))
            .Where(r => r.Confidence >= minimumConfidence)
            .Where(r => expectedType == null || r.BarcodeType == expectedType)
            .ToList();
    }
}

// Usage
var validated = BarcodeValidator.GetValidResults(
    "warehouse-scan.png",
    expectedType: BarcodeEncoding.Code128,
    minimumConfidence: 0.85);

if (validated.Count == 0)
{
    // No valid results — log and skip downstream processing
    return;
}

// Safe to pass to downstream systems
foreach (var barcode in validated)
{
    SendToInventorySystem(barcode.Value, barcode.BarcodeType.ToString());
}
$vbLabelText   $csharpLabel

El método validador devuelve una lista vacía en lugar de nulo — esto elimina la necesidad de que los llamadores verifiquen por nulos el valor de retorno, que es un patrón defensivo estándar. El parámetro expectedType opcional asegura que el sistema receptor solo reciba el formato de código de barras que espera, lo que previene desajustes cuando un escaneo detecta tanto un código QR como un Code 128 de la misma imagen.

Para lectura por lotes a través de múltiples archivos, aplique el mismo patrón por archivo y agregue resultados. La clase BarcodeReaderOptions admite ExpectBarcodeTypes para filtrar a nivel de escaneo, lo que reduce el ruido antes de la validación.

Próximos pasos

La verificación de nulos para operaciones de IronBarcode se reduce a dos patrones: proteja la colección BarcodeResults (nulo + vacío) antes de leer propiedades, y valide las cadenas de entrada antes de escribir. El validador reutilizable anterior centraliza ambas preocupaciones.

Para una cobertura más amplia, explore el tutorial de lectura de códigos de barras para la configuración de escaneo, la guía de formatos de datos de salida para todas las propiedades BarcodeResult, y la referencia API para la superficie completa de tipos.

Comience una prueba gratuita de 30 días para probar estos patrones contra datos de escaneo real. Cuando esté listo, vea las opciones de licencia a partir de $499.

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.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 2,108,094 | Versión: 2026.3 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package BarCode
ejecuta una muestra observa cómo tu cadena se convierte en un código de barras.