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

String


Denis Bittencourt Muniz

Pergunta

Olá galera! Tudo bem? Que saudades aqui do fórum \o/! Espero estar na atividade aí de novo como moderador, mano, xD!

Minha dúvida é a seguinte:

Class Tha
Private _formulario As New Form()

Public Property Formulario() As Form
Get
Return _formulario
End Get
Set(ByVal value As Form)
_formulario = value
End Set
End Property
End Class

...
...

Dim T As New Tha()
Dim f As Form
f = T.Formulario
f.Text = "Denis"
MsgBox(T.Formulario.Text) 'Será exibido "Denis", como esperado, já que é um tipo por referência.

REM P.S: eu citei a linguagem C#, pois a mesma deve ter o mesmo comportamento, porém o exemplo será apenas em VB.[/codebox]

Mas gostaria de fazer uma pergunta bem besta, hauhuah, mas o importante é tirar a dúvida: o único tipo de dados que é referência, mas se comporta (parecido) como tipo de valor seria String (System.String)? Pois no caso acima, eu fiz o teste usando uma propriedade String e tive um comportamento de tipo por valor, ou seja, uma cópia do valor foi feita. Se sim, caso esteja certo essa afrimação sobre o tipo String, teria jeito de construir uma classe que implemente esse comportamento? Bom, rsrsr, não venha com "gambiarras", tipo, criar um indexador (propriedade Default em VB) que clona o objeto, ou algo assim... :)

Bom, Falows!

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
Mas gostaria de fazer uma pergunta bem besta, hauhuah, mas o importante é tirar a dúvida: o único tipo de dados que é referência, mas se comporta (parecido) como tipo de valor seria String (System.String)? Pois no caso acima, eu fiz o teste usando uma propriedade String e tive um comportamento de tipo por valor, ou seja, uma cópia do valor foi feita.

Acho que você está confundindo com Java, não? String em .NET é um tipo valor (assim como Integer, Short, Long, Boolean, etc.). Não há nada de especial no comportamento de System.String.

Se sim, caso esteja certo essa afrimação sobre o tipo String, teria jeito de construir uma classe que implemente esse comportamento? Bom, rsrsr, não venha com "gambiarras", tipo, criar um indexador (propriedade Default em VB) que clona o objeto, ou algo assim... :)

Já que a afirmação não é correta, creio que a sua intenção era criar um tipo de dados por valor que não exista na linguagem, certo? Bom, creio que isso não seja possível. Isso porque você não tem como dizer ao compilador que um valor que você inventou (X23) é para ser tratado pela classe tal. O compilador sabe que o valor 2 pode ser tratado pelas classes Short, Integer e Long, por exemplo, e sabe que os valores True e False são tratados pela classe Boolean, e que "um teste" é um valor tratado pela classe String. Mas, como dizer para ele que X23 é um valor a ser tratado pela classe MeuPróprioValor? É para isso que existem as classes, justamente para representar valores complexos e que não fazem parte do conjunto de tipos de dados primários. Então, ao invés de você imaginar...

Dim v As MeuPróprioValor = X23
.... você tem que imaginar...
Dim v As New MeuPróprioValor("X23")

... onde eu escolhi passar "X23" como uma string para que a classe se encarregue de tratá-la da forma adequada (isso é você quem vai decidir).

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
String em .NET é um tipo valor

Gray??? ... :huh:, você mesmo falou, quando eu iniciava em .Net, que String era um tipo referência... veja a documentação (fonte: MSDN, Visual Basic Reference):

<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public NotInheritable [b]Class[/b] String
    Implements IComparable, ICloneable, IConvertible, IComparable(Of String), _
    IEnumerable(Of String), IEnumerable, IEquatable(Of String)
Até mesmo, usei a função 'IsReference' (creio que você deva conhecer) do VB para provar isso! Veja:
MsgBox(IsReference(Me.Text)) 'Propriedade Text da classe Form1. Retorna True.

Concorda? Falows!

P.S: Caso concorde, você tem algo a acrescentar sobre o suposto comportamento por valor por parte do tipo String.

Link para o comentário
Compartilhar em outros sites

  • 0

De fato, falei besteira. É que tudo indicava que String era um tipo por valor. Realmente String está implementada no namespace System como uma *classe* e não como uma estrutura, daí a sua característica de ser uma referência. Os demais tipos são implementados como estruturas (Int32, Int64, Double, etc.).

Mas, é fácil explicar porque ele se comporta como um valor no caso em questão. Lembre-se da declaração de uma função:

Public Function Função(ByVal valor As String) As String

End Function

Viu o ByVal em negrito? É ele que indica que o tipo de passagem, por valor ou por referência. O parâmetros de MsgBox() são todos por valor. Experimente criar uma função (ou rotina) com passagem por referência (ByRef) e altere a string e você verá a diferença.

Agora, o que você quer seria possível se existisse a possibilidade herdar do tipo System.ValueType. Mas, aparentemente não se pode herdar de nenhuma classe disponível no namespace System (mas como um Enum pode, creio que esse limite só seja imposto para tipos definidos pelo usuário).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hum... OK. Realmente, se eu usar ByVal, o valor não será alterado, já que na atribuição de uma String constante ao parâmetro, eu estaria modificando para qual objeto que o parâmetro em questão iria apontar e isso não é permitido em passagem por valor. A devida confusão foi feita pelo fato de String não ter uma propriedade de escrita, na qual eu pudesse verificar e, assim, confundi o próprio valor (constantes, digamos) String.

Muito obrigado Graymalkin! Falows!

Link para o comentário
Compartilhar em outros sites

  • 0

Apesar desse tópico ser um pouco antigo, achei legal falar a respeito devido a um assunto que parece simples, mas deixa muita confusão: Strings

String é um tipo referência, mas ele é imutável, isso quer dizer que, a cada alteração, é criado uma nova string, por exemplo:

string s;

s = "ola";
s += " tudo bem";
s += " obrigado";

Esse exemplo aloca três strings na memória, mas apenas a última contém uma referência, as outras serão removidas da memória pela Garbage Collector.

Uma boa saída para esse problema é a utilização da classe StringBuilder contida no namespace System.Text.

;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

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