
Tipos Nullables de C# (Cómo Funciona para Desarrolladores)
Al trabajar 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.
Nullable Types in C#
Por defecto, los tipos de valor en C# (por ejemplo, int, bool, DateTime) no pueden asignarse valores nulos. Para abordar esta limitación, C# introduce tipos de valor anulables, lo que te permite asignar nulo a tipos de valor. Los tipos anulables son particularmente útiles cuando necesitas representar la ausencia de un valor válido.
Declaración de tipos nulos
Para declarar un tipo anulable en C#, utiliza la siguiente sintaxis:
// Declare a nullable integer
int? nullableInt = null;' Declare a nullable integer
Dim nullableInt? As Integer = NothingAquí, int? es una abreviatura de Nullable<int>. La variable nullableInt puede contener un valor int o null.
Comprobación de nulos
Para verificar si una variable de tipo nullable tiene un valor o no, puede usar la propiedad HasValue o comparar la variable directamente con null, como se muestra a continuación:
if (nullableInt.HasValue)
{
// If nullableInt has a value, print it
Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
// If nullableInt does not have a value, print a message
Console.WriteLine("No value assigned.");
}If nullableInt.HasValue Then
' If nullableInt has a value, print it
Console.WriteLine("Value: " & nullableInt.Value)
Else
' If nullableInt does not have a value, print a message
Console.WriteLine("No value assigned.")
End IfAlternativamente, puedes usar el operador de fusión nula (??) para proporcionar un valor por defecto cuando el tipo anulable es nulo:
// Assign 0 if nullableInt is null
int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);' Assign 0 if nullableInt is null
Dim result As Integer = If(nullableInt, 0)
Console.WriteLine("Result: " & result)Si nullableInt es null, a result se le asignará 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 nulo, mientras que los tipos de referencia anulables permiten que los tipos de referencia sean no 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 nullable, agregue un signo de interrogación ? al tipo de dato:
// Declare a nullable double
double? nullableDouble = null;' Declare a nullable double
Dim nullableDouble? As Double = NothingEn este ejemplo, nullableDouble puede contener un valor double o null.
Tipos de referencia anulables
Los tipos de referencia nullable se introdujeron en C# 8.0. Puede habilitar los tipos de referencia nullable a nivel de proyecto o agregando la directiva #nullable enable al inicio de su archivo de código. Con los tipos de referencia nullable habilitados, los tipos de referencia deben marcarse explícitamente como nullable usando ?, ayudando a evitar posibles excepciones en tiempo de ejecución causadas por referencias nulas.
#nullable enable
// Declare a nullable string
string? nullableString = null;'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
' Declare a nullable string
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = NothingAquí, nullableString se permite que sea null. Si declara un tipo de referencia no nullable sin el ?, el compilador producirá advertencias si detecta asignaciones potencialmente nulas.
Habilitación de tipos de referencia anulables
Para habilitar los tipos de referencia nullable globalmente en un proyecto, agregue la siguiente línea a su archivo .csproj:
<Nullable>enable</Nullable>
Una vez habilitado, el compilador tratará los tipos de referencia como no anulables por defecto. Esta característica es especialmente útil para detectar problemas de referencia nula en tiempo de compilación en lugar de en tiempo de ejecución.
Ejemplos prácticos
Exploremos algunos ejemplos prácticos para solidificar tu comprensión de los tipos anulables.
Ejemplo 1: Tipo nulo con tipos de valor
En este ejemplo, usaremos un tipo anulable con int:
class Program
{
static void Main(string[] args)
{
int? nullableInt = null;
// Use null coalescing operator to assign a default value
int b = nullableInt ?? 10;
Console.WriteLine("b: " + b);
if (nullableInt.HasValue)
{
// nullableInt has a value
Console.WriteLine("nullableInt has value: " + nullableInt.Value);
}
else
{
// nullableInt is null
Console.WriteLine("nullableInt is null");
}
}
}Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim nullableInt? As Integer = Nothing
' Use null coalescing operator to assign a default value
Dim b As Integer = If(nullableInt, 10)
Console.WriteLine("b: " & b)
If nullableInt.HasValue Then
' nullableInt has a value
Console.WriteLine("nullableInt has value: " & nullableInt.Value)
Else
' nullableInt is null
Console.WriteLine("nullableInt is null")
End If
End Sub
End ClassAquí, nullableInt es una variable de tipo nullable de int. Si nullableInt es null, b obtiene el valor 10 gracias al operador de fusión nula. De lo contrario, b toma el valor de nullableInt.
Ejemplo 2: Tipos de referencia anulables
Ahora, veamos cómo funcionan los tipos de referencia anulables:
#nullable enable
class Program
{
static void Main()
{
string? nullableString = null;
string nonNullableString = "Hello";
// Use null coalescing operator to provide a default value for length
Console.WriteLine(nullableString?.Length ?? 0);
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"
' Use null coalescing operator to provide a default value for length
Console.WriteLine(If(nullableString?.Length, 0))
Console.WriteLine(nonNullableString.Length)
End Sub
End ClassEn el código anterior, nullableString puede ser null, y el operador de fusión nula asegura que si es null, la longitud de la cadena sea por defecto 0.
Ejemplo 3: Tipos nulos anidados
C# te permite declarar tipos anulables anidados. Por ejemplo:
// Redundant, but syntactically valid
int? nestedNullableInt = null;' Redundant, but syntactically valid
Dim nestedNullableInt? As Integer = NothingAunque 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 funcionalidad adicional y rara vez se usan.
Operador de coalescencia nula (??)
El operador de fusión nula (??) se utiliza frecuentemente con tipos anulables para proporcionar un valor por defecto cuando el tipo anulable es nulo. Este operador simplifica el código al evitar comprobaciones if-else explícitas.
int? nullableValue = null;
// Assign -1 if nullableValue is null
int defaultValue = nullableValue ?? -1;Dim nullableValue? As Integer = Nothing
' Assign -1 if nullableValue is null
Dim defaultValue As Integer = If(nullableValue, -1)En este ejemplo, si nullableValue es null, a defaultValue se le asignará -1. De lo contrario, defaultValue tomará el valor de nullableValue.
Errores en tiempo de compilación y tipos anulables
Con los tipos de referencia anulables habilitados, C# produce advertencias y errores durante la compilación cuando detecta posibles problemas con asignaciones nulas. Estos errores en tiempo de compilación ayudan a detectar problemas de manera anticipada, haciendo tu código más robusto.
Considera el siguiente ejemplo:
string? nullableString = null;
// This will produce a compiler warning because nullableString may be null
string nonNullableString = nullableString;'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
' This will produce a compiler warning because nullableString may be null
Dim nonNullableString As String = nullableStringEn este caso, asignar nullableString a nonNullableString produce una advertencia del compilador porque nullableString puede ser null, y asignarla a un tipo no nullable podría llevar a excepciones en tiempo de ejecución.
Uso de tipos anulables con IronPDF

IronPDF es una biblioteca PDF de 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 escenarios de generación de informes dinámicos, como cuando estás generando un PDF para un contable con datos financieros incompletos. Al usar tipos anulables, puedes manejar campos opcionales, evitar excepciones y proporcionar valores por defecto.
using IronPdf;
class Program
{
static void Main(string[] args)
{
int? optionalIncome = null; // Nullable type for optional income
string? clientName = "Iron Dev"; // Nullable reference type for client name
var renderer = new ChromePdfRenderer();
string htmlContent = $@"
<h1>Financial Report</h1>
<p>Client Name: {clientName ?? "Unknown"}</p>
<p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
// Render the HTML to a PDF
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Save the PDF to disk
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 for optional income
'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 for client name
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>"
' Render the HTML to a PDF
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Save the PDF to disk
pdf.SaveAs("FinancialReport.pdf")
Console.WriteLine("PDF Generated Successfully.")
End Sub
End Class
En este código, se utilizan tipos nullable (int? y string?) para manejar datos faltantes de manera segura. El operador de fusión nula (??) asegura que si falta algún dato, se use un valor por defecto en el PDF.
Conclusión
Los tipos anulables en C# son una herramienta poderosa para manejar valores nulos tanto en tipos de valor como en tipos de referencia. Al usar tipos anulables, puedes evitar excepciones de referencia nula y mejorar la robustez de tu código. Recuerda habilitar los tipos de referencia anulables en nuevos proyectos para beneficiarte de la revisión de errores en tiempo de compilación, y utiliza el operador de fusión nula (??) para simplificar tu código al tratar con tipos anulables.
IronPDF ofrece una prueba gratuita para ayudarte a explorar sus características antes de comprometerte. Sin costo inicial, puedes probar y ver cómo se adapta a tu proceso de desarrollo. Una vez que esté listo para avanzar, las licencias comienzan desde $999.

Jacob Mellor es Director de Tecnología de Iron Software y un ingeniero visionario pionero en la tecnología C# PDF. Como desarrollador original de la base de código principal de Iron Software, ha dado forma a la arquitectura de productos de la empresa desde su creación, transformándola, junto con el director ejecutivo Cameron Rimington, en una empresa de más de 50 personas que presta servicios a la NASA, Tesla y organismos gubernamentales de todo el mundo.
Artículos Relacionados


