AYUDA .NET

Tipos nulos en C# (Cómo funciona para desarrolladores)

Chipego
Chipego Kalinda
24 de octubre, 2024
Compartir:

Cuando trabajas con C#, a menudo necesitas manejar valores nulos, especialmente con tipos de referencia. Los tipos anulables en C# proporcionan una forma de representar valores indefinidos o ausentes para tipos de valor. Esta guía cubre lo esencial de los tipos anulables en C#, sus usos prácticos y cómo funcionan en diferentes escenarios. También exploraremos IronPDF más adelante en el artículo.

Tipos nulos en C#

Por defecto, los tipos de valor en C# (por ejemplo, int, bool, DateTime) no pueden ser asignados con valores nulos. Para abordar esta limitación, C# introduce tipos de valor anulables, lo que le permite asignar null a tipos de valor. Los tipos anulables son particularmente útiles cuando necesita representar la ausencia de un valor válido.

Declaración de tipos nulos

Para declarar un tipo anulable en C#, se utiliza la siguiente sintaxis:

// Nullable type variable value
int? nullableInt = null;
// Nullable type variable value
int? nullableInt = null;
' Nullable type variable value
Dim nullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

En este caso, int? es una abreviatura de Nullable. La variable nullableInt puede contener un valor int o null.

Comprobación de nulos

Para comprobar si una variable de tipo nullable tiene un valor o no, puede utilizar la propiedad HasValue o comparar directamente la variable con null. Por ejemplo:

if (nullableInt.HasValue)
{
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    Console.WriteLine("No value assigned.");
}
if (nullableInt.HasValue)
{
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    Console.WriteLine("No value assigned.");
}
If nullableInt.HasValue Then
	Console.WriteLine("Value: " & nullableInt.Value)
Else
	Console.WriteLine("No value assigned.")
End If
$vbLabelText   $csharpLabel

Alternativamente, puedes usar el operador de coalescencia nula (??) para proporcionar un valor predeterminado cuando el tipo anulable es nulo:

int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);
int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);
Dim result As Integer = If(nullableInt, 0)
Console.WriteLine("Result: " & result)
$vbLabelText   $csharpLabel

Si nullableInt es nulo, se asignará al resultado el valor predeterminado de 0.

Tipos de valor anulables frente a tipos de referencia anulables

En C#, los tipos de valor (como int, bool y double) difieren de los tipos de referencia (como string, object). Los tipos de valor anulables permiten que los tipos de valor representen nulos, mientras que los tipos de referencia anulables permiten que los tipos de referencia no sean anulables por defecto, reduciendo así el riesgo de excepciones de referencia nula.

Tipos de valores anulables

Un tipo de valor anulable permite que un tipo de valor tome un valor nulo. Para declarar un tipo de valor anulable, añada un signo de interrogación ? al tipo de datos:

double? nullableDouble = null;
double? nullableDouble = null;
Dim nullableDouble? As Double = Nothing
$vbLabelText   $csharpLabel

En este ejemplo, nullableDouble puede contener un valor doble o nulo.

Tipos de referencia anulables

Los tipos de referencia anulables se introdujeron en C# 8.0. Los tipos de referencia anulables se habilitan a nivel de proyecto o añadiendo la directiva #nullable enable al principio del archivo de código. Con los tipos de referencia anulables habilitados, los tipos de referencia deben marcarse explícitamente como anulables mediante ?, lo que ayuda a evitar posibles excepciones en tiempo de ejecución causadas por referencias nulas.

#nullable enable
string? nullableString = null;
#nullable enable
string? nullableString = null;
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
$vbLabelText   $csharpLabel

Aquí, se permite que nullableString sea null. Si declara un tipo de referencia no anulable sin el símbolo ?, el compilador producirá advertencias si detecta posibles asignaciones nulas.

Habilitación de tipos de referencia anulables

Para habilitar globalmente los tipos de referencia anulables en un proyecto, añada la siguiente línea a su archivo .csproj:

<Nullable>enable</Nullable>
XML

Una vez activado, el compilador tratará por defecto los tipos de referencia como no anulables. Esta función es especialmente útil para detectar problemas de referencias nulas en tiempo de compilación y no en tiempo de ejecución.

Ejemplos prácticos

Exploremos algunos ejemplos prácticos para consolidar su comprensión de los tipos anulables.

Ejemplo 1: Tipo nulo con tipos de valor

En este ejemplo, utilizaremos un tipo anulable con int:

class Program
{
    static void Main(string[] args)
    {
        int? nullableInt = null;
        int b = nullableInt ?? 10; // Use null coalescing operator
        Console.WriteLine("b: " + b);
        if (nullableInt.HasValue)
        {
            Console.WriteLine("nullableInt has value: " + nullableInt.Value);
        }
        else
        {
            Console.WriteLine("nullableInt is null");
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        int? nullableInt = null;
        int b = nullableInt ?? 10; // Use null coalescing operator
        Console.WriteLine("b: " + b);
        if (nullableInt.HasValue)
        {
            Console.WriteLine("nullableInt has value: " + nullableInt.Value);
        }
        else
        {
            Console.WriteLine("nullableInt is null");
        }
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim nullableInt? As Integer = Nothing
		Dim b As Integer = If(nullableInt, 10) ' Use null coalescing operator
		Console.WriteLine("b: " & b)
		If nullableInt.HasValue Then
			Console.WriteLine("nullableInt has value: " & nullableInt.Value)
		Else
			Console.WriteLine("nullableInt is null")
		End If
	End Sub
End Class
$vbLabelText   $csharpLabel

Aquí, nullableInt es una variable de tipo nullable de int. Si nullableInt es nulo, b obtiene el valor 10 debido al operador de coalescencia de nulos. De lo contrario, b toma el valor de nullableInt.

Ejemplo 2: Tipos de referencia anulables

Veamos ahora cómo funcionan los tipos de referencia anulables:

#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        Console.WriteLine(nullableString?.Length ?? 0); // Use null coalescing operator
        Console.WriteLine(nonNullableString.Length);
    }
}
#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        Console.WriteLine(nullableString?.Length ?? 0); // Use null coalescing operator
        Console.WriteLine(nonNullableString.Length);
    }
}
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
Friend Class Program
	Shared Sub Main()
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
		Dim nullableString As String = Nothing
		Dim nonNullableString As String = "Hello"
		Console.WriteLine(If(nullableString?.Length, 0)) ' Use null coalescing operator
		Console.WriteLine(nonNullableString.Length)
	End Sub
End Class
$vbLabelText   $csharpLabel

En el código anterior, nullableString puede ser null, y el operador null coalescing garantiza que, si es null, la longitud de la cadena sea 0 por defecto.

Ejemplo 3: Tipos nulos anidados

C# permite declarar tipos anulables anidados. Por ejemplo:

int?? nestedNullableInt = null;
int?? nestedNullableInt = null;
If(Integer, nestedNullableInt) = Nothing
$vbLabelText   $csharpLabel

Aunque los tipos anulables anidados pueden parecer redundantes, son sintácticamente válidos en C#. Sin embargo, en la práctica, los tipos anulables anidados no proporcionan ninguna funcionalidad adicional y rara vez se utilizan.

Operador coalescente nulo (??)

El operador de fusión nula (??) se utiliza frecuentemente con tipos anulables para proporcionar un valor predeterminado cuando el tipo anulable es nulo. Este operador simplifica el código al evitar las comprobaciones explícitas if-else.

int? nullableValue = null;
int defaultValue = nullableValue ?? -1;
int? nullableValue = null;
int defaultValue = nullableValue ?? -1;
Dim nullableValue? As Integer = Nothing
Dim defaultValue As Integer = If(nullableValue, -1)
$vbLabelText   $csharpLabel

En este ejemplo, si nullableValue es nulo, se asignará -1 a defaultValue. En caso contrario, defaultValue tomará el valor de nullableValue.

Errores de compilación y tipos anulables

Con los tipos de referencia anulables activados, C# produce advertencias y errores durante la compilación cuando detecta problemas potenciales con asignaciones nulas. Estos errores en tiempo de compilación ayudan a detectar problemas en una fase temprana, haciendo que el código sea más robusto.

Considere el siguiente ejemplo:

string? nullableString = null;
string nonNullableString = nullableString; // Compiler warning
string? nullableString = null;
string nonNullableString = nullableString; // Compiler warning
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
Dim nonNullableString As String = nullableString ' Compiler warning
$vbLabelText   $csharpLabel

En este caso, asignar nullableString a nonNullableString produce una advertencia del compilador porque nullableString puede ser nulo, y asignarlo a un tipo no anulable podría provocar excepciones en tiempo de ejecución.

Uso de tipos anulables con IronPDF

Tipos Nullable en C# (Cómo Funciona para Desarrolladores): Figura 1 - IronPDF: Biblioteca PDF de C#

IronPDF es una biblioteca de PDF para C# diseñada para ayudar a los desarrolladores a crear, editar y manipular archivos PDF directamente desde aplicaciones .NET. Puedes convertir HTML a PDF, generar informes o incluso manejar estructuras de documentos complejas.

Los tipos anulables son especialmente útiles en situaciones de generación de informes dinámicos, como cuando se genera un PDF para un contable con datos financieros incompletos. El uso de tipos anulables permite gestionar campos opcionales, evitar excepciones y proporcionar valores por defecto

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type
        string? clientName = "Iron Dev";  // Nullable reference type
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type
        string? clientName = "Iron Dev";  // Nullable reference type
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
Imports IronPdf
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim optionalIncome? As Integer = Nothing ' Nullable type
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? clientName = "Iron Dev";
		Dim clientName As String = "Iron Dev" ' Nullable reference type
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent As String = $"
            <h1>Financial Report</h1>
            <p>Client Name: {If(clientName, "Unknown")}</p>ignoreignore<p>Income: {If(optionalIncome?.ToString(), "Data not available")}</p>"
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		pdf.SaveAs("FinancialReport.pdf")
		Console.WriteLine("PDF Generated Successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

Tipos Nullable en C# (Cómo Funciona para Desarrolladores): Figura 2 - Salida de ejemplo de código

En este código, tipos anulables (int? y string?) se utilizan para manejar datos faltantes de manera segura. El operador de coalescencia nula (??) garantiza que si falta algún dato, se utilice un valor predeterminado en el PDF.

Conclusión

Tipos anulables de C# (Cómo funciona para los desarrolladores): Figura 3 - página de licencias de IronPDF

Los tipos anulables en C# son una potente herramienta para manejar valores nulos tanto en tipos de valor como en tipos de referencia. Mediante el uso de tipos anulables, puede evitar excepciones de referencia nula y mejorar la solidez de su código. Recuerde habilitar tipos de referencia anulables en nuevos proyectos para beneficiarse de la verificación de errores en tiempo de compilación, y use el operador de coalecencia nula (??) para simplificar su código al trabajar con tipos anulables.

IronPDF ofrece una prueba gratuita para ayudarte a explorar sus funciones antes de tomar una decisión. Sin ningún coste por adelantado, puedes probarlo y ver cómo encaja en tu proceso de desarrollo. Una vez que estés listo para avanzar, las licencias comienzan desde $749.

Chipego
Ingeniero de software
Chipego tiene una habilidad natural para escuchar que le ayuda a comprender los problemas de los clientes y a ofrecer soluciones inteligentes. Se unió al equipo de Iron Software en 2023, después de estudiar una licenciatura en Tecnología de la Información. IronPDF e IronOCR son los dos productos en los que Chipego se ha centrado, pero su conocimiento de todos los productos crece día a día, a medida que encuentra nuevas formas de ayudar a los clientes. Disfruta de lo colaborativa que es la vida en Iron Software, con miembros del equipo de toda la empresa que aportan su variada experiencia para contribuir a soluciones eficaces e innovadoras. Cuando Chipego está lejos de su escritorio, a menudo se le puede encontrar disfrutando de un buen libro o jugando al fútbol.
< ANTERIOR
C# ConfigureAwait (Cómo funciona para desarrolladores)
SIGUIENTE >
Convenciones de nomenclatura de C# (cómo funciona para los desarrolladores)