Jak obsługiwac 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 zgłasza wyjątek, jeśli wejście jest nullem, puste lub w nieprawidłowym formacie.

Zrodla skanowania w rzeczywistych sytuacjach, takie jak sygnaly z kamer, przesyłanie dokumentów i skanery magazynowe, mogą nie zawsze dostarczać czytelny kod kreskowy. Dostęp do właściwości wynikowych lub iterowanie kolekcji bez sprawdzenia wartości null lub pustych wartości może spowodować NullReferenceException w czasie wykonywania. Przekazywanie nieprawidłowych ciągów znaków do API pisania może skutkować ArgumentException. użycie strażników w operacjach odczytu i zapisu pomaga zapobiegać tym wyjątkom w produkcji.

Ten przewodnik wyjaśnia, jak obsłużyć puste i null wyniki w operacjach odczytu i zapisu IronBarcode, używając strażników, filtrowania według pewności i wzorca walidatora wielokrotnego użytku.


Podstawy: Obsluguj puste wyniki w operacjach z kodami kreskowymi

Użyj wzorca ochronnego IronBarcode, aby bezpiecznie sprawdzić kolekcję BarcodeResults przed dostępem do jakichkolwiek właściwości wynikowych. 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ługiwac puste wyniki z kodami kreskowymi?

Istnieją dwa tryby awarii: BarcodeResults jest nullem, jeśli wejście nie jest prawidłowym obrazem, i puste, jeśli obraz nie zawiera kodów kreskowych. Dostęp do First, Value lub iteracja bez weryfikacji obu warunków spowoduje wyjątek w czasie wykonywania.

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

Dane wejściowe

Kod kreskowy etykiety wysyłkowej Code128 (ścieżka sukcesu) i pusty obraz nie zawierający kodu kreskowego (ścieżka awarii).

Kod kreskowy Code128 kodujący SHP-20240001 użyty jako dane wejściowe etykiety wysyłkowej

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

Pusty biały obraz bez kodu kreskowego użyty do wywołania ścieżki pustego wyniku

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 dostarcza właściwości ciągów Value i Text, zwracając treść zakodowaną kodem kreskowym. 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 przekazywaniu pustych wartości do systemów docelowych.

BarcodeReaderOptions ma również właściwość ConfidenceThreshold (od 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 kodow kreskowych?

BarcodeWriter.CreateBarcode przyjmuje wartość tekstową i BarcodeWriterEncoding lub wyliczenia BarcodeEncoding. Przekazanie null lub pustego ciągu znaków natychmiast rzuca wyjątek. Również obowiązują ograniczenia formatu: EAN-8 akceptuje od 7 do 8 cyfr, UPC-A akceptuje od 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

Prawidłowe 7-cyfrowe wejście (1234567) generuje możliwy do zeskanowania kod kreskowy 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 zweryfikowac wyniki przed przetwarzaniem downstream?

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

Dane wejściowe

Skanowanie magazynowe kodu kreskowego Code128 użyte jako cel odczytu dla validatora.

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 symboliki, co zapobiega otrzymywaniu przez system docelowy nieoczekiwanych formatów, 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 skanowanie do oczekiwanych symbolik z góry, więc mniej niechcianych wyników dociera do validatora.


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.

Jak IronBarcode może pomóc w poprawie efektywności procesów biznesowych?

IronBarcode zwiększa efektywność procesów biznesowych, umożliwiając szybkie i dokładne generowanie i odczyt kodów kreskowych, redukując błędy ręcznego wprowadzania danych i poprawiając śledzenie zapasów i aktywów.

Jakie umiejętności programistyczne są potrzebne do zaimplementowania IronBarcode w projekcie?

Podstawowa znajomość programowania w C# jest wystarczająca do zaimplementowania IronBarcode w projekcie, ponieważ oferuje on nieskomplikowane metody i kompleksową dokumentację do prowadzenia deweloperów.

Czy IronBarcode jest odpowiedni zarówno dla małych projektów, jak i dużych aplikacji korporacyjnych?

IronBarcode jest zaprojektowany do bycia skalowalnym i wszechstronnym, dzięki czemu jest odpowiedni zarówno dla małych projektów, jak i dużych aplikacji korporacyjnych, które wymagają solidnych rozwiązań kodów kreskowych.

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,331,688 | Wersja: 2026.7 właśnie wydany
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.