我应该如何投 VB.NET?

How should I cast in VB.NET?

提问人:Zack Peterson 提问时间:9/3/2008 最后编辑:CommunityZack Peterson 更新时间:1/7/2023 访问量:188764

问:

这些都是平等的吗?在什么情况下我应该选择每一个?

  • 变量。ToString()

  • CStr(变量)

  • CType(var, 字符串)

  • DirectCast(var, 字符串)


编辑:来自NotMyself的建议...

  • TryCast(var, 字符串)
.NET vb.net 铸造

评论


答:

8赞 NotMyself 9/3/2008 #1

我更喜欢以下语法:

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

If str IsNot Nothing Then

呵呵,你可以看出我通常用 C# 编写代码。8)

我更喜欢 TryCast 的原因是您不必弄乱强制转换异常的开销。您的强制转换要么成功,要么您的变量初始化为 null,然后您相应地处理它。

评论

2赞 Shimmy Weitzhandler 11/9/2010
我想你错了。使用 TryCast 根本不是一个好主意。在像你这样的情况下,数字。应使用 ToString() 或 CStr(number)。
4赞 Dienekes 3/4/2011
@Shimmy:完全不使用 TryCast 的原因是什么?在某些情况下,DirectCast 避免异常不是更好吗?
3赞 ToolmakerSteve 3/19/2014
@Dienekes而不是我自己。TryCast 仅适用于 REFERENCE 类型。在这里,我们有一个 Integer,它是一个 VALUE 类型。编译器将拒绝 TryCast。此外,目标是字符串。除 Nothing 之外的任何 .Net 实体都支持 .值类型(如 Integer)不能为 Nothing。因此,在本例中,CStr(number) 或 number。ToString() 是安全的。在一般情况下(不仅仅是值类型),CStr(whatever) 是安全的,因为它可以处理 Nothing -- 结果将是 String 变量中的 Nothing。TryCast 非常有用 -- 只是不在这里。.ToString()
173赞 bdukes 9/3/2008 #2

它们都略有不同,并且通常具有可接受的用法。

  • var.ToString 将为您提供对象的字符串表示形式,无论它是什么类型。如果还不是字符串,请使用此选项。()var
  • CStr 是 VB 字符串强制转换运算符。我不是VB人,所以我建议避免它,但这不会真正伤害任何东西。我认为它基本上和.(var)CType
  • CType 将使用任何提供的转换运算符将给定类型转换为字符串。(var, String)
  • DirectCast 用于将对象向上投射到字符串中。如果您知道对象变量实际上是一个字符串,请使用它。这与 C# 中的相同。(var, String)(string)var
  • TryCast(如@NotMyself所述)类似于 ,但如果变量无法转换为字符串,它将返回,而不是抛出异常。这与 C# 中的相同。MSDN上的页面也有一个很好的比较。DirectCastNothingvar as stringTryCast

评论

16赞 Jonathan Allen 9/9/2008
永远没有理由使用 CType(var, String) 而不是 CStr(var),它们的作用完全相同。
2赞 bdukes 7/28/2010
@Maslow仅适用于值类型,因为它必须是可以作为值的类型TryCastNothing
2赞 bdukes 12/16/2010
@Martinho完全正确。这应该说“仅适用于引用类型”
3赞 MCattle 4/4/2013
CStr(var)如果 var 是 DBNull.Value,则会窒息并引发异常,但备用变量将返回一个空字符串。Convert.ToString(var)
0赞 Bellash 3/26/2014
Dim myList AS ArrayList=new ArrayList当你写的时候,它不起作用。我来写作,我找回了我的笑容。(From e In myList select CType(e.Name,String)).ToArray()... select CType(e.Name.ToString,String)).ToArray()
9赞 OwenP 9/3/2008 #3

MSDN 似乎表明特定类型的 Cxxx 强制转换可以提高 VB .NET 中的性能,因为它们已转换为内联代码。出于某种原因,在某些情况下,它还建议使用 DirectCast,而不是 CType(文档指出,当存在继承关系时;我相信这意味着在编译时检查强制转换的健全性并且可以应用优化,而 CType 始终使用 VB 运行时。

当我编写 VB .NET 代码时,我使用什么取决于我正在做什么。如果这是我要扔掉的原型代码,我会使用我碰巧输入的任何代码。如果这是我认真对待的代码,我会尝试使用 Cxxx 强制转换。如果不存在,如果我有理由相信存在继承关系,我会使用 DirectCast。如果在这种情况下,我不知道强制转换是否应该成功(例如,用户输入 -> 整数),那么我使用 TryCast 来做一些比向用户抛出异常更友好的事情。

我无法动摇的一件事是我倾向于使用 ToString 而不是 CStr,但据说 Cstr 更快。

0赞 joek1975 9/6/2008 #4

有一次,我记得看到 MSDN 库状态使用 CStr(),因为它更快。我不知道这是否属实。

评论

2赞 Jonathan Allen 9/9/2008
DirectCast 比 CStr 更快,但只能在将字符串对象强制转换为字符串变量时使用它。如果尝试将任何其他对象转换为字符串,它将失败。
4赞 Zack Peterson 9/20/2008 #5

用户 Konrad Rudolph 在 Stack Overflow 问题“VB.NET 的隐藏功能”中倡导 DirectCast()。

评论

1赞 ToolmakerSteve 3/19/2014
-1,因为 DirectCast 在这里明显不合适,除非在非常有限的情况下,您没有费心提及。当您知道有两个相关的引用类型,并且希望在它们之间进行有效的强制转换时,DirectCast 非常有用。由于问题是关于获得 ,因此 OP 不太可能讨论 DirectCast 合适的情况。String
0赞 ToolmakerSteve 3/19/2014
...如果问题没有提到,我的投诉将不适用。在将主题从一般的 CONVERSION 缩小到之前,您不应该提倡 DirectCast。StringToString
14赞 mule 11/26/2008 #6

Cstr()以内联方式编译以获得更好的性能。

CType如果定义了转换运算符,则允许在类型之间进行强制转换

ToString()如果无法进行转换,则在基类型和字符串之间引发异常。

TryParse()从 String 到 base possible 否则返回 falsetypeif

DirectCast如果类型通过继承相关或共享公共接口,则使用,如果无法强制转换,则将抛出异常,在这种情况下将不返回任何内容trycast

1赞 SickPuP 3/17/2011 #7

根据认证考试,您应该尽可能使用 Convert.ToXXX() 进行简单转换,因为它比 CXXX 转换更能优化性能。

评论

1赞 ToolmakerSteve 3/19/2014
仅供参考,根据 Microsoft 的 Paul Vick 的说法,至少在 2004 年,Cxxx 运算符比 Convert.Toxxx 函数更快,因为 Cxxx 直接编译为 IL,而不是调用函数。尽管他的理由似乎值得怀疑,但考虑到对函数调用进行 JIT 优化的能力。panopticoncentral.net/2004/05/31/the-native-net-language