C#中(double)str;与Convert.ToDouble(str);有什么区别

1. string str = "32323";
2. double a = (double)str ;
3. double a = Convert.ToDouble(str); 
第3行会转换成功,第2行就会报错,ToDouble方法会自动进行溢出检查,但是为什么第2行会失败?

转换方法

Method1: double.TryParse
Method2: Convert.ToDouble

str是个对象,不是指针,所以不能直接那样转。它们在内存中的分布也是不一样的。

在C#中, 类似于(double)str的这种数据类型转换, 被称为"显式强制转换", 而实现它的机制, 其实是 调用了一个在对象类型内部定义的方法, 其声明方式类似于下:

public static explicit operator double(int a)
{
   ...
}
其中的方法名 double 表示要转换的目标类型名称, 而参数则是要转换的源类型, 返回是operater。
所以, 第二行会报错的原因是因为在 double 的类型声明中, 没有定义 double(int a)的这种函数。
而至于Convert.ToDouble(str); 或者说TryParse, 其实现原理又与上面的不太一致, 他们的内部是实现了一个叫做 IConvertable的接口, 在MSDN, 会发现在很多基础类型的声明中, 都实现了这个叫做IConvertible的接口, 具体IConvertible的详细信息, MSDN中会有很详细的说明。

补充一个 MSDN 中的例子
// Must be defined inside a class called Farenheit:
public static explicit operator Celsius(Farenheit f)
{
    return new Celsius((5.0f/9.0f)*(f.degrees-32));
}
调用的时候如下使用
Farenheit f = new Farenheit(100.0f);
Celsius c = (Celsius)f;

时间: 2024-08-15 09:17:22

C#中(double)str;与Convert.ToDouble(str);有什么区别的相关文章

C#中Convert.ToDouble异常

Convert.ToDouble转换的时候,输入参数即便是“0.5”这样正常的字符串,也会引发异常,而大多是本机调试无异常,而放到客户机器会抛出异常的情况 问题出现在C#的本地语言设置里面(恶心的.net) 在main或者frmMain_Load之类的加载时候添加下面这句即可 Application.CurrentCulture = new System.Globalization.CultureInfo("en-US", true);

c++ 中double与string之间的转换,char *

/* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> //#include "MySqrt.h" #include <math.h> #include <vector> #include <typeinfo> #include <exception> #include <stdexcept> #includ

c++中double转换成string型(浮点数的格式化)

在日常编程中--包括对话框.关系数据库.金融程序.SMS程序及一切处理数据文件的程序,需要控制小数点后的小数位的情况非常普遍,本文中将要讲 解如何用简单的方法来控制小数位,另外,还要揭开字符串及数据精度的一点点小秘密. 问题的引出 如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45”这样的字符串.表面上看来 这是一个意义不大的编程问题,然而,如果真要在实际中派上用场,函数应设计为具有一定弹性,

python产生错误:can only concatenate str (not &quot;int&quot;) to str

代码为: #!/usr/bin/python # _*_ coding:utf-8_*_ # print("hello world!") name = input("name:") age = int(input("age:")) print(type(age)) #print(type(age), type(str(age))) home = input("home:") print(type(home)) info3=''

StringUtils.isBlank(str)和StringUtils.isEmpty(str)的区别

StringUtils.isBlank(str)和StringUtils.isEmpty(str)的区别还是看他们的实现有何不同 1.StringUtils.isEmpty(CharSequence cs)实现源码 public static boolean isEmpty(CharSequence cs) { return cs == null || cs.length() == 0; } 从源码发现StringUtils.isEmpty(CharSequence cs)是判断了cs为null

java中double变量保留小数问题

(转载自玄影池扁舟) 做java项目的时候可能经常会遇到double类型变量保留小数的问题,下面便把我的经验做个简短的总结: java中double类型变量保留小数问题大体分两种情况: (一):小数点后面位数过长,四舍五入保留指定位数: 可以用以下代码实现: public class TestDemo { public static void main(String[] args) {     double a=15.32743859;     double b=Math.round(a*100

char str[] = {&quot;abcd&quot;}和 char* str = {&quot;abcd&quot;}的区别

char str[] = {"abcd"}和 char* str = {"abcd"}的区别 char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址, 且函数调用完毕后 此

java中double四舍五入并设置小数点位数的问题

本文系转载,原文地址:http://blog.csdn.net/star_huang/article/details/7639267 今天遇到个需要将一个double类型的数据保留小数点后两位的问题.在网上搜寻的集中解决方案,copy来一下,备用 首先result_value是处理前的double get_double是用来保存我处理后的double   //方案一: get_double = (double)(Math.round(result_value*100)/100.0) //方案二:

Java中double类型的数据精确到小数点后两位

Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 二: new java.text.DecimalFormat("#.00").format(3.1415926) 三: double d = 3.1415926