none
Método retornando duas variáveis

    Pergunta

  • Fala pessoal tudo belezera com vcs???

    Eu e um amigo estávamos estudando algoritimo e resolvemos passar do papel para c# até que brecamos em uma parte em que o método retorna duas variáveis. Não conseguimos fazer isso em c#... A pergunta que não quer calar é?

    Como eu faço para o método "Retorna2" pegar dois números como "parâmetro de entrada" e retornar o valor de duas variáveis?

    Agradecido
    domingo, 22 de novembro de 2009 01:06

Respostas

  • Soulless-BR,

    Posso estar errado, mas até onde sei, um método só pode retornar um valor (ou um vetor de valores).
    Um método é indicado, basicamente, pelo tipo de retorno + nome + parâmetros. Ex.: 

    int RetornaInt(int valor1, int valor2)

    Então, não tem como "dizer" que um método irá retornar dois valores específicos (ainda mais se forem tipos diferentes).
    Para você pegar dois valores (tipos iguais) você pode retornar um vetor, sabendo que na posição 0 vai estar seu primeiro valor e na 1 vai estar o segundo.

    int[] Retorna2Int(int valor1, int valor2)
    {
       int[] retorno = new int[2];
       // .......
       return retorno;
    }

    Assim o int[] retornado terá os dois valores que você quer retornar. Ex.:

    int[] valores = new int[2];
    valores = Retorna2Int(1, 2);
    // valores[0] e valores[1] serão o retorno do método.

    Só conheço esse forma para se retornar mais de um valor.
    Espero ter ajudado.

    Abraço.


    Att, Rafael Risson
    domingo, 22 de novembro de 2009 13:34
  • Sim, uma funcao retorna só um valor, mas este pode ser uma  uma Struct, ou mesmo uma Classe. Existe a possibilidade de retornar valores por referencia (que particularmente eu acho horrivel e nao vou detalhar aqui)

    Exemplo, criei um formulario com dois botoes, que mostra os dois metodos :

    namespace WindowsFormsApplication8
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            //utilizaçao de Struct
            private CoOrdsSt ReturnCoOrdsSt(int x, int y)
            {

                CoOrdsSt coords1;

                // Initialize:
                coords1.x = x;
                coords1.y = y;

                return coords1;
            }
    //utilizaçao de classe
            private CoOrdsCl ReturnCoOrdsCl(int x, int y)
            {

                CoOrdsCl coords1=new CoOrdsCl(); //precisa cria uma instancia do objeto

                // Initialize:
                coords1.x = x;
                coords1.y = y;

                return coords1;

            }


            private void button1_Click(object sender, EventArgs e)
            {
                CoOrdsSt coords = ReturnCoOrdsSt(10, 20);


                MessageBox.Show(string.Format("x = {0}, y = {1}", coords.x, coords.y), "CoOrds 1: ");
            }

            private void button2_Click(object sender, EventArgs e)
            {
                CoOrdsCl coords = ReturnCoOrdsCl(10, 20);


                MessageBox.Show(string.Format("x = {0}, y = {1}", coords.x, coords.y), "CoOrds 1: ");
            }
        }

        public struct CoOrdsSt
        {
            public int x, y;

            public CoOrdsSt(int p1, int p2)
            {
                x = p1;
                y = p2;
            }
        }

        public class CoOrdsCl
        {
            public int x { get; set; }
            public int y { get; set; }
        }

    }


    Qual metodo é melhor? Eu particularmente optaria pela Classe, mas nao vejo muita diferença nesse caso.

    Att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    domingo, 22 de novembro de 2009 14:44
    Moderador
  • eh so usar o argumento out na frente do parametro:


    public void Metodo(out int param1, out int param2) {
          param1 = 0;
          param2 = 1
    }
    What would Brian Boitano do ?
    segunda-feira, 23 de novembro de 2009 00:37
    Moderador

Todas as Respostas

  • Soulless-BR,

    Posso estar errado, mas até onde sei, um método só pode retornar um valor (ou um vetor de valores).
    Um método é indicado, basicamente, pelo tipo de retorno + nome + parâmetros. Ex.: 

    int RetornaInt(int valor1, int valor2)

    Então, não tem como "dizer" que um método irá retornar dois valores específicos (ainda mais se forem tipos diferentes).
    Para você pegar dois valores (tipos iguais) você pode retornar um vetor, sabendo que na posição 0 vai estar seu primeiro valor e na 1 vai estar o segundo.

    int[] Retorna2Int(int valor1, int valor2)
    {
       int[] retorno = new int[2];
       // .......
       return retorno;
    }

    Assim o int[] retornado terá os dois valores que você quer retornar. Ex.:

    int[] valores = new int[2];
    valores = Retorna2Int(1, 2);
    // valores[0] e valores[1] serão o retorno do método.

    Só conheço esse forma para se retornar mais de um valor.
    Espero ter ajudado.

    Abraço.


    Att, Rafael Risson
    domingo, 22 de novembro de 2009 13:34
  • Sim, uma funcao retorna só um valor, mas este pode ser uma  uma Struct, ou mesmo uma Classe. Existe a possibilidade de retornar valores por referencia (que particularmente eu acho horrivel e nao vou detalhar aqui)

    Exemplo, criei um formulario com dois botoes, que mostra os dois metodos :

    namespace WindowsFormsApplication8
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            //utilizaçao de Struct
            private CoOrdsSt ReturnCoOrdsSt(int x, int y)
            {

                CoOrdsSt coords1;

                // Initialize:
                coords1.x = x;
                coords1.y = y;

                return coords1;
            }
    //utilizaçao de classe
            private CoOrdsCl ReturnCoOrdsCl(int x, int y)
            {

                CoOrdsCl coords1=new CoOrdsCl(); //precisa cria uma instancia do objeto

                // Initialize:
                coords1.x = x;
                coords1.y = y;

                return coords1;

            }


            private void button1_Click(object sender, EventArgs e)
            {
                CoOrdsSt coords = ReturnCoOrdsSt(10, 20);


                MessageBox.Show(string.Format("x = {0}, y = {1}", coords.x, coords.y), "CoOrds 1: ");
            }

            private void button2_Click(object sender, EventArgs e)
            {
                CoOrdsCl coords = ReturnCoOrdsCl(10, 20);


                MessageBox.Show(string.Format("x = {0}, y = {1}", coords.x, coords.y), "CoOrds 1: ");
            }
        }

        public struct CoOrdsSt
        {
            public int x, y;

            public CoOrdsSt(int p1, int p2)
            {
                x = p1;
                y = p2;
            }
        }

        public class CoOrdsCl
        {
            public int x { get; set; }
            public int y { get; set; }
        }

    }


    Qual metodo é melhor? Eu particularmente optaria pela Classe, mas nao vejo muita diferença nesse caso.

    Att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    domingo, 22 de novembro de 2009 14:44
    Moderador
  • eh so usar o argumento out na frente do parametro:


    public void Metodo(out int param1, out int param2) {
          param1 = 0;
          param2 = 1
    }
    What would Brian Boitano do ?
    segunda-feira, 23 de novembro de 2009 00:37
    Moderador
  • Bom dia , 


       De uma lida nesse artigo :

    http://boredzo.org/pointers/

    Fala sobre ponteiros em C , se vc conseguir sacar como usa ponteiros em C , passar esse conceito pra c# é facil ainda mais que em c# vc nem precisa usar ponteiros pra isso .. vc passa valores por referencia , como mostra esse outro artigo :

    http://msdn.microsoft.com/pt-br/library/cc517979.aspx


    Att.






    http://www.donuts4u.com.br ! Web 2.0, mobile e games: A cultura Donuts4U.
    segunda-feira, 23 de novembro de 2009 12:41