当前位置: 首页 > 编程语言 > C#

转换、解析和转换的区别分享

时间:2023-04-11 02:36:51 C#

转换、解析和转换的区别我一直在研究一些代码。我有一个问题:转换、解析和转换之间有什么区别?我们什么时候可以使用它们?转换是当您获取一种类型的变量并将其更改为另一种类型时。您只能在某些情况下这样做,例如:stringstr="Hello";对象o=str;字符串str2=(字符串)o;//转换不会改变变量的值-值保持相同的类型(charString"Hello")。转换是指从一种类型中获取值并将其转换为另一种类型:doubled=5.5;inti=(int)d;//请注意,在这种情况下,转换是作为一个转换完成的。解析是获取一个字符串并通过理解其内容将其转换为另一种类型。例如,将字符串“123”转换为数字123,或将字符串“Saturday,September22nd”转换为DateTime。转换:告诉编译器一个对象确实是别的东西而不改变它(尽管可能会导致一些数据丢失)。对象obj_s="12345";字符串str_i=(字符串)obj;//"12345"作为字符串,显式intsmall=12345;长大=0;大=小;//12345为long,隐式解析:告诉程序解释(在运行时)字符串。字符串int_s="12345";inti=int.Parse(int_s);//12345asintconversion:告诉程序使用内置方法尝试改变类型,这可能不是简单的可以互换的。双配音=123.45;inti=System.Convert.ToInt32(dub);//123asint这三个术语各有特定用途:从一种类型转换为另一种类型需要某种形式的兼容性,通常是通过继承或实现接口。转换可以是隐式的或显式的:classFoo:IFoo{//implementations}//implicitcastpublicIFooGetFoo(){returnFoo;}//显式转换publicIFooGetFoo(){returnFooasIFoo;有很多方法可以解析。我们阅读了XML解析;有些类型有Parse和TryParse方法;然后我们有时需要解析字符串或其他类型以提取“我们关心的东西”。int.Parse("3")//返回一个整数值3int.TryParse("foo",outintVal)//如果字符串可以解析则返回真;否则错误的转换可能需要将一种类型更改为另一种具有不兼容类型的A类型。这也可能涉及一些解析。转换示例通常是IMO,它非常特定于上下文。转换(到需要兼容的类型)数据类型之间的转换可以使用castsstaticvoid_Casting(){inti=10;浮动f=0;f=我;//隐式转换,不会丢失数据。f=0.5F;我=(int)f;//显式转换。信息将丢失。}解析(解析是不同类型之间的转换:)将一种类型转换为另一种类型可以称为解析uisngint.parseintnum=int.Parse("500");像XML一样遍历数据项也可以称为解析当涉及到用户定义的转换时,这通常需要返回不同的对象/值。用户定义的转换通常存在于值类型之间而不是引用类型之间,因此这很少成为问题。ConvertusingConvert-class其实只是帮你解析而已更多信息请看http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx这个问题其实很复杂...通常,强制转换只是告诉运行时将一种类型更改为另一种类型。这些必须是兼容的类型。例如,int总是可以表示为long,因此它可以转换为long。有些演员有副作用。例如,如果将float转换为int,它将失去精度。所以(int)1.5f将导致int值1。转换通常是更改类型的最快方法,因为它是一个IL运算符。例如,代码:publicvoidCastExample(){inti=7;长l=(long)i;}通过运行IL代码执行转换:conv.i8//convertto8-byteinteger(akaInt64,akalong)。解析是接受一个类型一次并返回另一个类型的函数。它是一个实际的代码函数,而不仅仅是一个IL运算符。这通常需要更长的时间来运行,因为它运行多行代码。例如,这段代码:publicvoidParseExample(){strings="7";longl=long.Parse(s);}运行IL代码:callint64[mscorlib]System.Int64::Parse(string)换句话说,它被称为实际方法。在内部,Int64类型提供了方法:publicstaticlongParse(Strings){returnNumber.ParseInt64(s,NumberStyles.Integer,NumberFormatInfo.CurrentInfo);}和Number.Parse:[System.Security.SecuritySafeCritical]//自动生成的内部不安全静态Int64ParseInt64(Stringvalue,NumberStylesoptions,NumberFormatInfonumfmt){Byte*numberBufferBytes=stackallocByte[NumberBuffer.NumberBufferBytes];NumberBuffernumber=newNumberBuffer(numberBufferBytes);int64我=0;StringToNumber(值,选项,参考编号,numfmt,false);if((options&NumberStyles.AllowHexSpecifier)!=0){if(!HexNumberToInt64(refnumber,refi)){thrownewOverflowException(Environment.GetResourceString("Overflow_Int64"));}}else{if(!NumberToInt64(refnumber,refi)){thrownewOverflowException(Environment.GetResourceString("Overflow_Int64"));}}返回我;}etc...所以你可以看到它实际上是做了很多代码。现在事情变得更加复杂,而转换通常是最快的,类可以覆盖隐式和显式转换运算符。例如,如果我写这个类:publicclassCastableClass{publicintIntValue{get;放;}publicstaticexplicitoperatorint(CastableClasscastable){returncastable.IntValue;我已经覆盖了int的显式转换运算符,所以我现在可以这样做:publicvoidOverridedCastExample(){CastableClasscc=newCastableClass{IntValue=7};inti=(int)cc;这看起来像一个普通的转换,但它实际上调用了我在类中定义的方法。IL代码是:callint32UnitTestProject1.CastableClass::op_Explicit(classUnitTestProject1.CastableClass)所以你通常想要尽可能多地转换。如果你不能,然后解析。转换:或解析转换显式调用从一种类型到另一种类型的转换运算符。转换变量并不简单。一套复杂的规则解决了强制。在某些情况下,数据会丢失并且无法撤消转换。在其他情况下,执行引擎会抛出异常。int.Parse是最简单的方法,但它会在无效输入时抛出异常。TryParseint.TryParse是C#语言中解析整数最有用的方法之一。此方法的工作原理与int.Parse相同。int.TryParse尝试并捕获内部结构。所以,它不会抛出异常Convert:convertingaprimitivedatatypetoanotherprimitivedatatype。Convert.ToInt32及其兄弟Convert.ToInt16和Convert.ToInt64实际上是int.Parse方法的静态包装方法。许多程序员推荐TryParse而不是Convert或Cast。资料来源:http://www.dotnetperls.com不同的人用它表示不同的事物。在.net世界之外,这不一定是正确的,但这是我在.net上下文中在EricLippert的博客上读到的内容:从一种形式到另一种形式的所有类型转换都可以称为转换。一种分类方法可能是隐式的——a.表示一个变化(又名强制)inti=0;双d=我;对象o=i;//(具体叫装箱转换)IConvertibleo=i;//(具体称为装箱转换)需要一个隐式转换运算符,转换总是成功(隐式转换运算符永远不应该抛出),改变被转换对象的引用标识。b.保留(也称为隐式引用转换)strings="";对象o=s;IListl=newList();只对引用类型有效,永远不会改变被转换对象的引用标识,转换总是成功,在编译时保证,没有运行时检查。显式(也称为铸造)-一个。表示改变inti=0;枚举e=(枚举)i;对象o=i;我=(int)o;//(具体叫拆箱转换)需要一个显式的转换操作符,改变被转换对象的引用标识,转换可能成功也可能不成功,在运行时检查兼容性。b.表示保留(也称为显式引用转换)对象o="";字符串s=(字符串)o;仅对引用类型有效,从不更改被转换对象的引用标识,转换可能成功也可能不成功,在运行时检查兼容性。虽然转换是语言级别的构造,但Parse在框架级别的意义上是一个非常不同的东西,换句话说,它们是为从输入获取输出而编写的自定义方法,例如int.Parse,它接受一个字符串并返回一个int.以上就是C#学习教程分享的全部内容:强制转换、解析和转换的区别。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: