Ir para conteúdo
Fórum Script Brasil
  • 0

Operadores.net


Denis Bittencourt Muniz

Pergunta

Fala galera! beleza?

Queria tirar alguma dúvidas sobre operadores, comparando VB.net com C#:

Divisão (que retrona inteiro)

VB.net: \

C#: /1 <- Mas não conseguir usar, alguém poderia postar um exemplo? Eu tentei 15 /1 2, mas não deu certo.

Exponencial

VB.net: ^

C#: <-No caso, o C# não teria um operador para esse tipo de operação? Ou é obrigado usar o método 'pow' da classe 'Math'?

Null coalescing (nome, em inglês)

VB.net: <-No caso, o VB não teria um operador para esse tipo de operação?

C#: ??

Hum... a propósito, para que serve esse operador? Algum exemplo?

Bit shift

O que fazem esses operadores? Sei que tem o direito e o esquerdo.. mas?? Gostaria de um exemplo também, se possível.

Bitwise And, Or e Xor

Esses seriam os operadores que fazem comparação Bit-a-Bit? Por exemplo: 6 And 2, retorna 2, certo? Se for, o Graymalkin tinha explicado isso lá na sala de VB.

valeu!

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Pelo que entendo, tipos valores são passados somente seu valor e tipos referência são passados pelo endereço da memória, certo? Mas porque, em qualquer linguagem, por exemplo, VB.net e C#, posso passar um 'Integer' e um 'int' por referência?? Creio que não sei tudo sobre esse assunto de passagem de valores... Gostaria de explicação mais detalhada sobre o assunto... Mais um coisa: Só existe por 'valor' e por 'referência´?

Falows!

Link para o comentário
Compartilhar em outros sites

  • 0

Pelo que entendo, tipos valores são passados somente seu valor e tipos referência são passados pelo endereço da memória, certo? Mas porque, em qualquer linguagem, por exemplo, VB.net e C#, posso passar um 'Integer' e um 'int' por referência?? Creio que não sei tudo sobre esse assunto de passagem de valores... Gostaria de explicação mais detalhada sobre o assunto... Mais um coisa: Só existe por 'valor' e por 'referência´?

Falows!

Veja bem: "tipo valor" (value type) e "tipo referência" (reference type) são coisas *diferentes* de "passagem por valor" (byval) e "passagem por referência" (byref).

Tanto um "tipo valor" quanto um "tipo referência" podem ser passados "por valor" ou "por referência".

A idéia de "passar por referência" é manter uma referência para o objeto/variável original de modo que qualquer alteração efetuada em relação ao mesmo, dentro da função ou rotina, seja refletida na variável/objeto local. A idéia de "passar por valor" consiste em fazer uma "cópia" da variável/objeto para a função ou rotina, não modificando a variável/objeto original.

Sacou? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

OK, eu até sabia sobre a 'passagem', mas não sabia que era um conceito diferente de "tipo valor" (value type) e "tipo referência" (reference type) ... Então você poderia me explicar o que é "tipo valor" (value type) e "tipo referência" (reference type)?

Outra: VB.net e C#, o padrão de passagem de argumentos é por referência, assim como no VB6?

Falows!

Link para o comentário
Compartilhar em outros sites

  • 0

OK, eu até sabia sobre a 'passagem', mas não sabia que era um conceito diferente de "tipo valor" (value type) e "tipo referência" (reference type) ... Então você poderia me explicar o que é "tipo valor" (value type) e "tipo referência" (reference type)?

Tipo referência é todo aquele que você precisa criar um objeto através do operador new, ou seja, a partir de uma classe (como as classes Form, Point, ArrayList, Bitmap, DataGrid, etc.). Somente o tipo string é que tem um "atalho" que permite a instância automática (mas ainda assim é possível instanciar um objeto da classe System.String com o operador new). Já um tipo valor é definido por um valor, como 2 (int ou Integer), 2.3 (double ou Double), 2.3D (Decimal no VB.NET), 'a' ou "a"c (char ou Char), True e False (bool ou Boolean), #4/1/2005 8:43:17 PM# (DateTime no VB.NET), etc.

Outra: VB.net e C#, o padrão de passagem de argumentos é por referência, assim como no VB6?

Não, por padrão a passagem é por valor, ao contrário do VB6.

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Tipo referência é todo aquele que você precisa criar um objeto através do operador new, ou seja, a partir de uma classe (como as classes Form, Point, ArrayList, Bitmap, DataGrid, etc.). Somente o tipo string é que tem um "atalho" que permite a instância automática (mas ainda assim é possível instanciar um objeto da classe System.String com o operador new). Já um tipo valor é definido por um valor, como 2 (int ou Integer), 2.3 (double ou Double), 2.3D (Decimal no VB.NET), 'a' ou "a"c (char ou Char), True e False (bool ou Boolean), #4/1/2005 8:43:17 PM# (DateTime no VB.NET), etc.

Mas porque os tipos referências precisam do operador 'new'? Por que um 'int' não precisa??? Mas também tem aquele seguinte: 'int x = new int();'. Porque posso fazer isso? Isso por que C# "considera" todos os tipos objetos?

Sinceramente, você pode me achar um burro, mas vou falar a verdade, não entendi sua explicação, ainda continuo na 'estaca zero'...

Aguardo respostas : )

P.S: Deleta aí o tópico do meu irmão, usei a conta dele sem querer ¬ _ ¬

Link para o comentário
Compartilhar em outros sites

  • 0

Mas porque os tipos referências precisam do operador 'new'?

Porque eles não possuem "valores" que possam caracterizá-los.

Por que um 'int' não precisa???

Porque os inteiros por si só já são objetos.

Mas também tem aquele seguinte: 'int x = new int();'. Porque posso fazer isso? Isso por que C# "considera" todos os tipos objetos?

Isso é válido porque você estará criando uma nova instância de int e atribuindo-a a "x". No caso, isso é o mesmo que fazer:

int x = 0;
Sinceramente, você pode me achar um burro, mas vou falar a verdade, não entendi sua explicação, ainda continuo na 'estaca zero'...
Então vou tentar explicar com exemplos. Como eu disse acima, os tipos referência não possuem "valores" que possam caracterizá-los, enquanto que os tipos valor possuem. Não sei se você já utilizou, mas a classe Point() é utilizada para representar uma ponto (x e y) em um plano. Se eu fizer...
Point p;
... vou definir que "p" é do tipo Point, porém ainda não existe um objeto ali. Qualquer tentativa de se utilizar "p" resultará em um erro porque a referência é nula, ou seja, ainda não foi criado um objeto para ser apontado por "p". E como eu crio esse objeto? Através do operador new:
p = new Point(10, 20);
Por que eu tive que fazer isso? Porque não existe um valor que represente um objeto da classe Point, sendo o mesmo só representável através de um objeto da classe (e objetos são instanciados com o operador new). Desta maneira eu vou poder fazer:
Point p;
p = new Point(10, 20);
MessageBox.Show(p.ToString());
Agora, vejamos um int. Se eu declaro...
int x;
... eu estou definindo que "x" é do tipo int (ou System.Int32). Mas, ainda falta eu inicializar "x" da mesma maneira que fiz com "p". Porém, observe a diferença:
int x = 5;
Por que eu pude colocar o 5 em "x"? Porque 5, por si só, já é um objeto do tipo inteiro. E ele não é também um valor? Daí o nome "tipo valor". Você já deve saber que o método GetType() de qualquer objeto retorna o seu tipo, então, para provar que qualquer valor inteiro *é* um objeto, podemos fazer:
int x = 5;
MessageBox.Show(x.GetType().ToString());
MessageBox.Show((10).GetType().ToString());
MessageBox.Show((256).GetType().ToString());
Tanto x, quanto 10, quanto 256 são objetos do tipo System.Int32, como você vai poder conferir com o exemplo acima. E se quiséssemos fazer algo semelhante a isso com a classe Point? Seria assim:
MessageBox.Show(new Point(10, 20).GetType().ToString());
Note que "new Point(10, 20)" irá criar um objeto (que é uma *referência*) e é dele que chamaremos o método GetType(). No outro exemplo, chamamos este mesmo método dos objetos 10 e 256 (que são *valores*). Entendeu agora a diferença? Veja outros exemplos (de tipos valor):
MessageBox.Show('a'.GetType().ToString());
MessageBox.Show(2.GetType().ToString());
MessageBox.Show(2.3.GetType().ToString());
MessageBox.Show(false.GetType().ToString());
MessageBox.Show(2L.GetType().ToString());
MessageBox.Show(2.5M.GetType().ToString());

Todos estes tipos (char, int, double, bool, long e decimal) são *representáveis* através de *valores*. Agora, qual seria o "valor" que representaria um objeto Form, um objeto Point, um objeto ArrayList, etc.? Como tais valores não existem, o que temos são referências (objetos) destas classes.

Komprenis? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Humm... valeu Graymalkin. É verdade: 2, 5, 2999 são valores/objetos. No entanto não tem um valor para representar 'Form', como citado acima, mas aí que uso a referência, assim: 'Form a = new Form();', certo? Uso o operador 'new' em Classes para criar instâncias, pois já que é por referência (como poderia ter valor para o objeto 'pessoa', já que está têm campos, como 'idade', 'nome', 'altura', etc.. certo? : ) ).

Bom, beleza, entendi! Mas...

...porque 'struct' é por valor, já que está tem uma estrutura parecida com o de uma classe?? Se não me engano, 'struct' suporta conceitos de campos, métodos, métdos construtores, etc.. Só não suporta herança... correto?

Aguardando respostas...

Link para o comentário
Compartilhar em outros sites

  • 0

Humm... valeu Graymalkin. É verdade: 2, 5, 2999 são valores/objetos. No entanto não tem um valor para representar 'Form', como citado acima, mas aí que uso a referência, assim: 'Form a = new Form();', certo? Uso o operador 'new' em Classes para criar instâncias, pois já que é por referência (como poderia ter valor para o objeto 'pessoa', já que está têm campos, como 'idade', 'nome', 'altura', etc.. certo? : ) ).

Exatamente! biggrin.gif

Bom, beleza, entendi! Mas...

...porque 'struct' é por valor, já que está tem uma estrutura parecida com o de uma classe??

Porque escolheu-se assim. Assim como é útil ter-se tipos referência também é útil ter-se tipos valor. Veja o exemplo abaixo:

struct MeuValor
{
    public int x;
}

class MinhaReferência
{
    public int x;
}
MeuValor n;
n.x = 2;
MeuValor n2 = n;
n.x = 3;

MessageBox.Show(String.Format("n.x={0}, n2.x={1}", n.x.ToString(), n2.x.ToString()));

MinhaReferência r = new MinhaReferência();
r.x = 2;
MinhaReferência r2 = r;
r.x = 3;

MessageBox.Show(String.Format("r.x={0}, r2.x={1}", r.x.ToString(), r2.x.ToString()));

Notou a diferença? Em um tipo valor (em uma struct) o que importa é o valor em si, por isso ao atribuir um objeto para outro é feita uma cópia (estamos copiando o *valor*). Já na referência não. Sacou? wink.gif Existe também uma diferença interna (no código compilado) em relação a uma estrutura e uma classe.

Se não me engano, 'struct' suporta conceitos de campos, métodos, métdos construtores, etc.. Só não suporta herança... correto?

Sim, ela não suporta herança porque automaticamente qualquer struct herda de ValueType (e como a .NET só permite herança simples, não múltipla, não dá pra herdar outra classe).

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi... Passagem por valor cria cópia do valor, como acontece n.x=3 n2.x=2. Mas referência é diferente, como acontece r.x=3 r2.x=3, já que o valor de r2 depende do valor de r, pois é uma referência, certo?

Falows!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,7k
×
×
  • Criar Novo...