none
Static RRS feed

  • Pregunta

  • Hola a todos una consulta si yo tengo una clase en  mi capa datos que voy a mostrar a continuación. Si en mi clase tengo métodos static y a la clase le pongo estatic y cuando llame al metodo de mi capa lógica ya no sera necesario instanciar la clase? esta es  mi pregunta.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.Common;
    using E = Entidades;
    using System.Data;
    
    namespace CapaDatos
    {
        public static class ClienteCD
        {
            public static int GenerarCodigo()
            {
                int cod;
                using (DbConnection cn = Conexion.Conectar())
                {
                    cn.Open();
                    DbCommand cmd = cn.CreateCommand();
                    string strSQL = "SELECT ISNULL(MAX(idcliente) + 1 ,0) AS idCliente  FROM Clientes";
                    cmd.CommandText = strSQL;
                    cod = Convert.ToInt32(cmd.ExecuteScalar());
                    return cod;
                }
            }
    
            public static string AddCliente(E.ClienteE cli)
            {
                try
                {
                    using (DbConnection cn = Conexion.Conectar())
                    {
                        cn.Open();
                        using (DbCommand cmd = cn.CreateCommand())
                        {
                            cmd.CommandText = "xspAddCliente";
                            cmd.CommandType = CommandType.StoredProcedure;
    
                            Utilidades util = new Utilidades();
                            cmd.Parameters.Add(util.CreateParameter("@idCliente", DbType.Int32, cli.IdCliente));
                            cmd.Parameters.Add(util.CreateParameter("@identificacion", DbType.AnsiString, cli.Identificacion, 13));
                            cmd.Parameters.Add(util.CreateParameter("@razonSocial", DbType.AnsiString, cli.RazonSocial, 80));
                            cmd.Parameters.Add(util.CreateParameter("@nombreComercial", DbType.AnsiString, cli.NombreComercial, 60));
                            cmd.Parameters.Add(util.CreateParameter("@ciudad", DbType.AnsiString, cli.Ciudad, 40));
                            cmd.Parameters.Add(util.CreateParameter("@direccion", DbType.AnsiString, cli.Direccion, 100));
                            cmd.Parameters.Add(util.CreateParameter("@telefono", DbType.AnsiString, cli.Telefono, 9));
                            cmd.Parameters.Add(util.CreateParameter("@celular", DbType.AnsiString, cli.Celular, 9));
                            cmd.ExecuteNonQuery();
                            return String.Empty;
                        }
                    }
                }
                catch (Exception ex)
                {
                   MessageBox.Show (ex.ToString());
                    return ex.Message;
                }
            }


    Pedro Avila

    miércoles, 28 de noviembre de 2012 13:47

Respuestas

  • No.  Cualquier método static, ya sea una clase static o no.

    public class ClaseNoEstatica
    {
        public static void ElMetodoEstatico()
        {
            ...
        }
    }
    
    //Puede hacerse lo siguiente sin una instancia:
    ClaseNoEstatica.ElMetodoEstatico();


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 13:59
    miércoles, 28 de noviembre de 2012 13:53
    Moderador
  • Si eso satisface sus requerimientos, perfecto entonces.  Eso suele hacerse con clases que contienen métodos utilitarios, como conversiones de tipos de datos y demás.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 13:59
    miércoles, 28 de noviembre de 2012 13:56
    Moderador
  • hola

    ya sea que definas

    public class CapaDatos{

        public static string AddCliente(E.ClienteE cli) {

       }

    }

    o que definas

    public static class CapaDatos{

        public static string AddCliente(E.ClienteE cli) {

       }

    }

    puedes acceder al metodo Addcliente sin crear una instancia de la clase

    la diferencia en pones el static a nivel de clase que que limitas que esa clase solo tendra metodo estaticos, o puede dejarlo abierto para tener tambien metodo de instancia

    a veces es util  dejarlo mixto porque podrias hacer

    public class Usuario{

        public bool Autenticar(string nombre, string pass) {

       }

      public static Encriptar(string texto){

      }

    }

    o sea tienes una clase que es de isntancia y otra que es una utilidad para encriptar que es static

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 14:12
    miércoles, 28 de noviembre de 2012 14:00
  • depende si vas a utliziar algun patron tipo IoC entonces el static no lo uses nunca en esa implementacion

    ahora si es algo simple que sabes nunca vas a extender entocnes podrias usarlo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 14:14
    miércoles, 28 de noviembre de 2012 14:01

Todas las respuestas

  • Los métodos static pueden accederse sin tener una instancia de la clase.

    Jose R. MCP
    Code Samples

    miércoles, 28 de noviembre de 2012 13:49
    Moderador
  • Pero siempre que la clase que lo contiene sea static verdad?

    Pedro Avila

    miércoles, 28 de noviembre de 2012 13:50
  • No.  Cualquier método static, ya sea una clase static o no.

    public class ClaseNoEstatica
    {
        public static void ElMetodoEstatico()
        {
            ...
        }
    }
    
    //Puede hacerse lo siguiente sin una instancia:
    ClaseNoEstatica.ElMetodoEstatico();


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 13:59
    miércoles, 28 de noviembre de 2012 13:53
    Moderador
  • WebJose gracias por responder, entonces se puede implementar métodos en una clase que tanto el método como la clase que lo contiene sean static y así evitarme instanciar objetos. me recomendarías trabajar así? 

    Pedro Avila

    miércoles, 28 de noviembre de 2012 13:54
  • Si eso satisface sus requerimientos, perfecto entonces.  Eso suele hacerse con clases que contienen métodos utilitarios, como conversiones de tipos de datos y demás.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 13:59
    miércoles, 28 de noviembre de 2012 13:56
    Moderador
  • hola

    ya sea que definas

    public class CapaDatos{

        public static string AddCliente(E.ClienteE cli) {

       }

    }

    o que definas

    public static class CapaDatos{

        public static string AddCliente(E.ClienteE cli) {

       }

    }

    puedes acceder al metodo Addcliente sin crear una instancia de la clase

    la diferencia en pones el static a nivel de clase que que limitas que esa clase solo tendra metodo estaticos, o puede dejarlo abierto para tener tambien metodo de instancia

    a veces es util  dejarlo mixto porque podrias hacer

    public class Usuario{

        public bool Autenticar(string nombre, string pass) {

       }

      public static Encriptar(string texto){

      }

    }

    o sea tienes una clase que es de isntancia y otra que es una utilidad para encriptar que es static

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 14:12
    miércoles, 28 de noviembre de 2012 14:00
  • depende si vas a utliziar algun patron tipo IoC entonces el static no lo uses nunca en esa implementacion

    ahora si es algo simple que sabes nunca vas a extender entocnes podrias usarlo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila miércoles, 28 de noviembre de 2012 14:14
    miércoles, 28 de noviembre de 2012 14:01
  • Muchas gracias Leandro por responder y tomarte el tiempo en explicarme te entendí nítido y aprendí algo nuevo hoy.

     

    Pedro Avila

    miércoles, 28 de noviembre de 2012 14:12