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)
Zack Peterson
fonte

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.
bdukes
fonte
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

Siddharth Rout
fonte
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.

OwenP
fonte
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.

Eu não
fonte
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

O usuário Konrad Rudolph defende o DirectCast () na questão Stack Overflow "Hidden Features of VB.NET" .

Zack Peterson
fonte
-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.

SickPuP
fonte
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.

joek1975
fonte
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