Como devo transmitir no VB.NET?


151

São todos iguais? Em que circunstâncias devo escolher um dos outros?

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


EDIT: Sugestão de NotMyself

  • TryCast (var, String)

Respostas:


156

Essas são todas ligeiramente diferentes e geralmente têm um uso aceitável.

  • var.ToString()fornecerá a representação de seqüência de caracteres de um objeto, independentemente do tipo. Use isso se varainda não for uma string.
  • CStr(var)é o operador de conversão de string VB. Como eu não sou do tipo VB, sugiro evitá-lo, mas não vai doer nada. Eu acho que é basicamente o mesmo que CType.
  • CType(var, String) converterá o tipo especificado em uma string, usando qualquer operador de conversão fornecido.
  • DirectCast(var, String)é usado para converter um objeto em uma string. Se você souber que uma variável de objeto é, de fato, uma string, use isso. É o mesmo que (string)varem c #.
  • TryCast(como mencionado por @ NotMyself ) é como DirectCast, mas retornará Nothingse a variável não puder ser convertida em uma string, em vez de gerar uma exceção. É o mesmo que var as stringem c #. A TryCastpágina no MSDN também tem uma boa comparação.

15
Nunca há uma razão para usar CType (var, String) em vez de CStr (var), eles fazem exatamente a mesma coisa.
1113 Jonathan Allen

2
@Maslow TryCastsó funciona para tipos de valor, uma vez que tem de ser um tipo que pode ter Nothingcomo valor
bdukes

1
@ Martinho bastante certo. Isso deve dizer "só funciona para o tipo de referência "
bdukes

3
CStr(var)sufocará e gerará uma exceção se o var for DBNull.Value, mas a alternativa Convert.ToString(var)retornará uma sequência vazia.
MCattle

Dim myList AS ArrayList=new ArrayListQuando você escreve (From e In myList select CType(e.Name,String)).ToArray(), não funciona. Eu vim para escrever ... select CType(e.Name.ToString,String)).ToArray()e recuperei meu sorriso.
Bellash 25/03

13

Cstr() é compilado em linha para melhor desempenho.

CType permite transmissões entre tipos se um operador de conversão for definido

ToString() Entre o tipo base e a sequência lança uma exceção se a conversão não for possível.

TryParse()De String para base typeifpossível, caso contrário, retorna false

DirectCastusado se os tipos estiverem relacionados por herança ou compartilharem uma interface comum, lançará uma exceção se o elenco não for possível, trycastnão retornará nada nesta instância


8

O MSDN parece indicar que o Cxxx lança para tipos específicos pode melhorar o desempenho no VB .NET porque eles são convertidos em código embutido. Por alguma razão, ele também sugere o DirectCast, em vez do CType, em certos casos (as documentações indicam que é quando há uma relação de herança; acredito que isso significa que a sanidade do elenco é verificada no momento da compilação e otimizações podem ser aplicadas, enquanto o CType sempre usa o Tempo de execução do VB.)

Quando estou escrevendo código VB .NET, o que eu uso depende do que estou fazendo. Se é o código do protótipo que vou jogar fora, uso o que digito. Se for um código sério, tento usar uma conversão Cxxx. Se não existir, eu uso o DirectCast se tiver uma crença razoável de que há um relacionamento de herança. Se for uma situação em que não faço ideia se a conversão deve ser bem-sucedida (entrada do usuário -> números inteiros, por exemplo), então uso o TryCast para fazer algo mais amigável do que lançar uma exceção para o usuário.

Uma coisa que não posso abalar é que eu uso o ToString em vez do CStr, mas supostamente o Cstr é mais rápido.


8

Eu prefiro a seguinte sintaxe:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Hah, você pode dizer que normalmente escrevo código em C #. 8)

O motivo pelo qual prefiro o TryCast é que você não precisa mexer com a sobrecarga de lançar exceções. Seu elenco é bem-sucedido ou sua variável é inicializada como nula e você lida com isso de acordo.


2
Eu acho que você está errado. não é uma boa ideia usar o TryCast. em um caso como o seu, number.ToString () ou CStr (number) deve ser usado.
Shimmy Weitzhandler

4
@Shimmy: Qual é a razão por trás de não usar o TryCast? Não é melhor que o DirectCast evite uma exceção em determinados cenários?
Dienekes

3
@Dienekes e NotMyself. O TryCast é apenas para os tipos REFERENCE. Aqui, temos um número inteiro, que é um tipo VALUE. O compilador rejeitará o TryCast. Além disso, o objetivo é uma String. Qualquer entidade .Net, exceto Nothing suporta .ToString(). Um tipo de valor, como Inteiro, não pode ser Nada. Portanto, nesse caso, CStr (número) ou number.ToString () é seguro. No caso geral (não apenas os tipos de valor), o CStr (qualquer que seja) é seguro, porque pode lidar com Nothing - o resultado será Nothing, na variável String. O TryCast é muito útil - mas não aqui.
Home

4

-1 porque o DirectCast NÃO é apropriado aqui, exceto em situações muito limitadas, que você não se deu ao trabalho de mencionar. O DirectCast é bom quando você sabe que tem dois TIPOS DE REFERÊNCIA RELACIONADOS e deseja uma conversão eficiente entre eles. Como a pergunta é sobre a obtenção de um String, é improvável que o OP esteja discutindo uma situação em que o DirectCast é apropriado.
Home

... Se a pergunta não tivesse sido mencionada Stringe ToString, minha reclamação não se aplicaria. Você não deve advogar pelo DirectCast até ter reduzido o tópico da CONVERSÃO geral.
Home

1

De acordo com o exame de certificação, você deve usar Convert.ToXXX () sempre que possível para conversões simples, pois otimiza o desempenho melhor que as conversões CXXX.


1
Para sua informação, de acordo com Paul Vick, da Microsoft, os operadores Cxxx eram mais rápidos que as funções Convert.Toxxx, pelo menos em 2004, porque o Cxxx é compilado diretamente na IL, em vez de chamar uma função. Embora sua lógica pareça duvidosa, dada a capacidade de otimizar as chamadas de função ausentes por JIT. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

Ao mesmo tempo, lembro de ter visto o estado da biblioteca do MSDN usar CStr () porque era mais rápido. Eu não sei se isso é verdade.


2
O DirectCast é mais rápido que o CStr, mas você só pode usá-lo ao converter um objeto de string em uma variável de string. Ele falhará se você tentar converter qualquer outro objeto em uma string.
1113 Jonathan Allen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.