elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Referencia de objeto no establecida como instancia de un objeto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Referencia de objeto no establecida como instancia de un objeto  (Leído 7,914 veces)
Fixxed

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Referencia de objeto no establecida como instancia de un objeto
« en: 11 Marzo 2016, 15:03 pm »

Hola, tengo el siguiente problema. He creado un array de clases, pero cuando quiero inicializarlo (Es decir, poner todos sus valores a 0), me tira el famoso error:

Citar
An unhandled exception of type 'System.NullReferenceException'

Referencia a objeto no establecida como instancia de un objeto.

Alguien sabe a que se debe?? Les dejo el código:

Form1.cs
Código
  1. public void CargarArray(ref Pedido[] peds)
  2.        {
  3.            int i = 0;
  4.            for (i = 0; i < 500; i++)
  5.            {
  6.                peds[i].cliente = "NADA";
  7.                peds[i].producto = "NADA";
  8.                peds[i].cantidad = 0;
  9.                peds[i].preciou = 0;
  10.                peds[i].calle = "NADA";
  11.                peds[i].num = 0;
  12.                peds[i].distrito = "NADA";
  13.            }
  14. }
  15.  
  16. private void ImprimirClientes(object obj, PrintPageEventArgs ev)
  17.        {
  18.            Pedido[] peds = new Pedido[500];
  19.  
  20.            CargarArray(ref peds);
  21. }

Pedido.cs
Código
  1. public class Pedido
  2.    {
  3.        public String cliente;
  4.        public String producto;
  5.        public int cantidad;
  6.        public double preciou;
  7.        public String calle;
  8.        public int num;
  9.        public String distrito;
  10.    }


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: Referencia de objeto no establecida como instancia de un objeto
« Respuesta #1 en: 11 Marzo 2016, 16:18 pm »

Alguien sabe a que se debe??

El famoso mensaje de error se explica por si solo, estás intentando referenciar un objeto que NO ha sido inizializado.

Para que lo entiendas mejor: En el código que has mostrado, estás inicializando el Array, pero no los valores del Array, los valores son todo nulos.

Dicho esto, para no perder la "elegancia" del código puedes utilizar una query Linq-To-Objects de la siguiente manera:

Vb.Net
Código
  1. Dim peds As Pedido() = (New Pedido(499) {}).Select(Function(element) New Pedido).ToArray()

C#:
Código
  1. var peds = new Pedido[499].Select(element => new Pedido()).ToArray();

O puedes crear una extensión de método rehutilizable para cualquier ocasión:

Vb.Net:
Código
  1. ' By Elektro
  2.  
  3. Public Module ArrayExtensions
  4.  
  5.    <Runtime.CompilerServices.Extension>
  6.    Public Sub InitializeElements(Of T As New)(ByVal sender As T())
  7.  
  8.        For index As Integer = 0 To (sender.Length - 1)
  9.  
  10.            If (sender(index) IsNot Nothing) Then
  11.  
  12.                If sender(index).GetType.GetInterfaces.Contains(GetType(IDisposable)) Then
  13.                    DirectCast(sender(index), IDisposable).Dispose()
  14.                    sender(index) = Nothing
  15.                End If
  16.  
  17.            End If
  18.  
  19.            sender(index) = New T
  20.  
  21.        Next index
  22.  
  23.    End Sub
  24.  
  25. End Module

Modo de empleo:
Código
  1. Dim peds As Pedido() = (New Pedido(499) {})
  2. peds.InitializeElements()

Traducción online a C#:
Código
  1. // By Elektro
  2.  
  3. public static class ArrayExtensions {
  4.  
  5. [Runtime.CompilerServices.Extension()]
  6. public static void InitializeElements<T>(T[] sender) where T : new() {
  7.  
  8. for (int index = 0; index <= (sender.Length - 1); index++) {
  9.  
  10. if ((sender(index) != null)) {
  11. if (sender(index).GetType.GetInterfaces.Contains(typeof(IDisposable))) {
  12. ((IDisposable)sender(index)).Dispose();
  13. sender(index) = null;
  14. }
  15. }
  16. sender(index) = new T();
  17. }
  18. }
  19. }
  20.  
  21. //=======================================================
  22. //Service provided by Telerik (www.telerik.com)
  23. //=======================================================

Modo de empleo:
Código
  1. var peds = new Pedido[499]
  2. peds.InitializeElements()



Por último, ten presente que puedes (y deberías) inicializar el valor por defecto de los campos de tu Type, desde el constructor de tu Type, y no desde un método local cualqueira.

Código
  1. public sealed class Pedido
  2. {
  3.  
  4. public string Cliente { get; set; }
  5. public string Producto { get; set; }
  6. public int Cantidad { get; set; }
  7. public double Precio { get; set; }
  8. public string Calle { get; set; }
  9. public int Num { get; set; }
  10. public string Distrito { get; set; }
  11.  
  12. public Pedido()
  13. {
  14. this.Cliente = "NADA";
  15. this.Producto = "NADA";
  16. this.Calle = "NADA";
  17. this.Distrito = "NADA";
  18. }
  19.  
  20. }
(no es necesario hacerlo para los tipos numéricos)

Saludos!


« Última modificación: 12 Marzo 2016, 08:21 am por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines