Jak obsługiwać sprawdzanie null w operacjach z kodami kreskowymi w C

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

IronBarcode zwraca wyniki skanowania jako kolekcję BarcodeResults w C# poprzez BarcodeReader.Read. Ta metoda zwraca null, jeśli obraz wejściowy nie jest rozpoznawany, lub pustą kolekcję, jeśli nie wykryto kodów kreskowych. BarcodeWriter.CreateBarcode rzuca wyjątek, jeśli wejście jest null, puste lub w niepoprawnym formacie.

Źródła skanowania w rzeczywistych sytuacjach, takie jak sygnały z kamer, przesyłanie dokumentów i skanery magazynowe, mogą nie zawsze dostarczać czytelny kod kreskowy. Uzyskiwanie dostępu do właściwości wyników lub iteracja kolekcji bez sprawdzania pod kątem wartości null lub pustych może spowodować NullReferenceException w czasie wykonywania. Przekazywanie nieprawidłowych ciągów znaków do API zapisu może skutkować ArgumentException. Użycie strażników w operacjach odczytu i zapisu pomaga zapobiegać tym wyjątkom w produkcji.

Ten poradnik wyjaśnia, jak obsługiwać puste wyniki w operacjach czytania i pisania z IronBarcode, wykorzystując strażników, filtrowanie pewności oraz wzorzec walidatora do ponownego użycia.


Podstawy: Obsługuj puste wyniki w operacjach z kodami kreskowymi

Użyj wzorca strażników IronBarcode, aby bezpiecznie sprawdzić kolekcję BarcodeResults przed uzyskaniem dostępu do jakichkolwiek właściwości wyników. Zacznij od razu od tego minimalnego odczytu i sprawdzenia:

  1. Install IronBarcode with NuGet Package Manager

    PM > Install-Package BarCode
  2. Skopiuj i uruchom ten fragment kodu.

    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. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronBarcode w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer

Jak obsługiwać puste wyniki z kodami kreskowymi?

Istnieją dwa tryby błędu: BarcodeResults jest null, jeśli wejście nie jest poprawnym obrazem, i pusty, jeśli na obrazie nie ma kodów kreskowych. Uzyskiwanie dostępu do First, Value lub iterowanie bez weryfikacji obu warunków spowoduje wyjątek w czasie wykonywania.

Sprawdź oba warunki przed rozpoczęciem pętli przetwarzania:

Dane wejściowe

Etykieta wysyłkowa Code128 (ścieżka success) oraz pusty obraz zawierający żadnego kodu kreskowego (ścieżka failure).

Code128 barcode encoding SHP-20240001 used as the shipping label input

shipping-label.png (ścieżka success)

Blank white image with no barcode used to trigger the empty result path

blank-image.png (ścieżka failure, brak kodu kreskowego)

: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
$vbLabelText   $csharpLabel

Każdy BarcodeResult udostępnia właściwości ciągów Value i Text, oba zwracające zawartość dekodowanego kodu kreskowego. Znacznie uszkodzone kody kreskowe lub częściowe skany mogą generować puste lub białe wartości. Użyj string.IsNullOrWhiteSpace na każdym wyniku, aby zapobiec docieraniu pustych wartości do systemów downstream.

BarcodeReaderOptions ma również właściwość ConfidenceThreshold (0,0 do 1,0), która odrzuca odczyty niskiej jakości, zanim dotrą do kolekcji wyników:

: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
$vbLabelText   $csharpLabel

Jak zastosować wzorce zabezpieczone przed null w pisaniu kodów kreskowych?

BarcodeWriter.CreateBarcode przyjmuje wartość ciągu znaków oraz BarcodeWriterEncoding lub BarcodeEncoding enum. Przekazanie null lub pustego ciągu znaków natychmiast rzuca wyjątek. Ograniczenia formatu również mają zastosowanie: EAN-8 akceptuje 7 do 8 cyfr, UPC-A akceptuje 11 do 12, a Code 128 ma limit znaków. Walidacja wejścia przed wywołaniem utrzymuje te wyjątki poza krokiem kodowania:

: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")
$vbLabelText   $csharpLabel

Wynik

Poprawne wejście 7-cyfrowe (1234567) generuje skanowalny kod EAN-8. Wejścia null, puste lub nienumeryczne są wychwytywane przez strażników i nigdy nie docierają do kroku kodowania.

Kod kreskowy EAN-8 wygenerowany z poprawnego wejścia 7-cyfrowego 1234567

API pisania także wykonuje swoją własną, wewnętrzną walidację: sprawdza sumy kontrolne, weryfikuje ograniczenia długości i odrzuca nieprawidłowe znaki dla wybranego kodowania. Powyższe strażnicy łapią problemy wcześniej, dając dzwoniącemu kontrolę nad komunikatem o błędzie i ścieżką odzyskiwania. Dla pełnej listy obsługiwanych kodowań i ich ograniczeń, zobacz jak tworzyć kody kreskowe i przewodnik o tworzeniu kodów kreskowych z danych.


Jak zweryfikować wyniki przed przetwarzaniem downstream?

Gdy dane kodu kreskowego są przekazywane do innego systemu (zapis bazy danych, wywołanie API, drukarka etykiet), warto skonsolidować liczbę wyników, integralność wartości i sprawdzenie typu w jedną metodę do ponownego użycia przed przekazaniem danych dalej:

Dane wejściowe

Skan magazynowy kodu kreskowego Code128 wykorzystywany jako cel odczytu dla walidatora.

Kodowanie kodu kreskowego Code128 WH-SCAN-4471 używane jako wejście skanu magazynowego w przykładzie walidatora
: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
$vbLabelText   $csharpLabel

Metoda zwraca pustą listę zamiast null, więc dzwoniący nie musi sprawdzać null dla wartości zwracanej. Opcjonalny parametr expectedType filtruje według symbologii, co zapobiega otrzymywaniu nieoczekiwanych formatów przez system downstream, gdy skan wychwytuje zarówno kod QR, jak i Code 128 z tego samego obrazu.

Dla odczytów zbiorczych przez wiele plików, zastosuj ten sam wzorzec na plik i zbierz wyniki. Opcja ExpectBarcodeTypes na BarcodeReaderOptions zawęża skan do oczekiwanych symbologii od razu, więc mniej niepożądanych wyników dociera do walidatora.


Więcej informacji

Zapoznaj się z opcjami licencyjnymi, gdy potok będzie gotowy do produkcji.

Często Zadawane Pytania

Czym jest sprawdzanie na null w operacjach z kodami kreskowymi?

Sprawdzanie na null w operacjach z kodami kreskowymi polega na weryfikacji, czy wynik lub dane wejściowe są nullem, aby zapobiec błędom w czasie wykonywania i zapewnić płynne przetwarzanie kodów kreskowych.

Dlaczego sprawdzanie na null jest ważne w operacjach z kodami kreskowymi w C#?

Sprawdzanie na null jest kluczowe w operacjach z kodami kreskowymi w C# dla unikania wyjątków i zapewnienia, że aplikacja może sprawnie obsługiwać przypadki, gdy dane kodów kreskowych mogą być brakujące lub nieprawidłowe.

Jak IronBarcode może pomóc w sprawdzaniu na null?

IronBarcode oferuje wbudowane metody do łatwego obsługiwania wartości null, umożliwiając programistom bezpieczne zarządzanie danymi kodu kreskowego bez potrzeby ręcznego implementowania skomplikowanej logiki walidacji.

Jakie są najlepsze praktyki dla sprawdzania na null w IronBarcode?

Najlepsze praktyki obejmują sprawdzanie wartości null w BarcodeResults, walidację danych wejściowych przed przetwarzaniem i używanie filtrów zaufania w celu zapewnienia wiarygodnych wyników skanowania kodów kreskowych.

Czy IronBarcode może filtrować wyniki według zaufania, aby uniknąć wyników null?

Tak, IronBarcode pozwala na filtrowanie wyników kodów kreskowych według poziomów zaufania, co pomaga zmniejszyć ilość wyników null i zapewni wysoką dokładność odczytu kodów kreskowych.

Czy istnieje sposób na walidację danych wejściowych do zapisu przy użyciu IronBarcode?

IronBarcode umożliwia walidację danych wejściowych do zapisu, aby upewnić się, że dane kodowane w kody kreskowe są prawidłowe i kompletne, zapobiegając problemom podczas generowania kodów kreskowych.

Co się dzieje, jeśli wynik kodu kreskowego na null nie jest obsługiwany?

Jeśli wynik kodu kreskowego na null nie jest obsługiwany, może to prowadzić do wyjątków w czasie wykonania i zaburzyć przepływ aplikacji, powodując potencjalne awarie lub nieprawidłowe operacje.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 2,145,441 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package BarCode
uruchom przykład zobacz, jak twoje ciągi zamieniają się w kody kreskowe.