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 języku 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 dane wejściowe są null, puste lub mają nieprawidłowy format.

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 wyników lub iteracja kolekcji bez sprawdzania wartości null lub pustych może spowodować NullReferenceException w czasie wykonywania. Przekazanie nieprawidłowych ciągów znaków do interfejsu API zapisu może spowodować 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 guard 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ługiwac puste wyniki z kodami kreskowymi?

Istnieją dwa tryby błędów: BarcodeResults ma wartość null, jeśli dane wejściowe nie są prawidłowym obrazem, oraz jest puste, jeśli obraz nie zawiera BARCODE-ów. Dostęp do First, Value lub iteracja bez sprawdzenia obu warunków spowoduje wyjątek w czasie wykonywania.

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

Dane wejściowe

Etykieta wysyłkowa z BARCODEm Code128 (scenariusz pomyślny) oraz pusty obrazek bez BARCODE'a (scenariusz niepomyślny).

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ągu znaków Value i Text, z których obie zwracają zdekodowaną zawartość BARCODE. Znacznie uszkodzone kody kreskowe lub częściowe skany mogą generować puste lub białe wartości. Użyj string.IsNullOrWhiteSpace w każdym wyniku, aby zapobiec przedostawaniu się pustych wartości do systemów niższego szczebla.

BarcodeReaderOptions posiada również właściwość ConfidenceThreshold (0,0 do 1,0), która odrzuca odczyty niskiej jakości, zanim dotrą one do zbioru 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ść ciągu znaków oraz wyliczenie BarcodeWriterEncoding lub BarcodeEncoding. Przekazanie null lub pustego ciągu znaków natychmiast rzuca wyjątek. Obowiązują również ograniczenia formatowe: 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łowy 7-cyfrowy wpis (1234567) generuje BARCODE EAN-8, który można zeskanować. 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

Skan kodu BARCODE Code128 z magazynu użyty 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 symboliki, co zapobiega otrzymywaniu przez system końcowy nieoczekiwanych formatów, gdy skanowanie wykrywa 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 w BarcodeReaderOptions zawęża skanowanie do oczekiwanych symboli z góry, dzięki czemu do walidatora trafia mniej niepożądanych wyników.


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,240,258 | Wersja: 2026.5 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.