c# 数据类型、类型转换、变量、常量、运算符
一、数据类型
在 C# 中,变量分为以下几种类型:
- 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
值类型(Value types)
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。
值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。
引用类型(Reference types)
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。
指针类型(Pointer types)
指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。
知识点
1、decimal,double,float的区别
- 三者是精度不同的浮点数,
精确度简单来说就是保留到小数点后几位
试运行如下所示
float 8位
double 16位
decimal 28位
二、类型转换
类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:
- 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
- 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
1、隐式转换
隐式转换:从类型A到类型B的转换可以在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换。
隐式转换不需要做任何工作,也不需要另外编写代码。如将int型数据转换成double型数据:
int a = 10; double b = a;//隐式转换
隐式转换规则是:任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B。基于这个转换规则,C#的隐式转换不会导致数据丢失。需要注意的是我们最常用的简单类型bool和string没有隐式转换。
2、显式转换
显式转换:从类型A到类型B的转换只能在某些情况下进行,转换规则比较复杂,应进行某种类型的额外处理。显式转换又叫强制类型转换,显式转换需要用户明确的指定转换类型。如将double类型数据转换成int类型数据:
double c = 10.5; int d = (int)c;//显示转换
提醒:
(1)、显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型。无法进行类型转换。
(2)、强制类型转换会造成数据丢失,如上面的例子中,最终得到的d值为10。
3、通过方法进行类型转换
(1)、使用ToString()方法。所有类型都继承了Object基类,所以都有ToString()这个方法(转化成字符串的方法)。
(2)、通过int.Parse()方法转换,参数类型只支持string类型。注意:使用该方法转换时string的值不能为为NULL,不然无法通过转换;另外string类型参数也只能是各种整型,不能是浮点型,不然也无法通过转换 (例如int.Parse("2.0")就无法通过转换)。
int i; i = int.Parse("100");
(3)、通过int.TryParse()方法转换,该转换方法与int.Parse()转换方法类似,不同点在于int.Parse()方法无法转换成功的情况该方法能正常执行并返回0。也就是说int.TryParse()方法比int.Parse()方法多了一个异常处理,如果出现异常则返回false,并且将输出参数返回0。
int i; string s = null; int.TryParse(s,out i);
(4)、通过Convert类进行转换,Convert类中提供了很多转换的方法。使用这些方法的前提是能将需要转换的对象转换成相应的类型,如果不能转换则会报格式不对的错误。注意:使用Convert.ToInt32(double value)时,如果 value 为两个整数中间的数字,则返回二者中的偶数;即 4.5 转换为 4,而 5.5 转换为 6。
(5)、实现自己的转换,通过继承接口IConventible或者TypeConventer类,从而实现自己的转换。
知识点
1、int.TryParse()
public static bool TryParse(string s, out Int32 result);
如果转换成功则返回true。否则返回false
int.TryParse(string s,out int i) 的参数: s是要转换的字符串,i 是转换的结果。
执行成功返回true,输出转换成功的值;执行失败返回0
经过测试发现如下: int i=0; 1、s 为null int.TryParse(null,out i) false 2、s 为空字符串 int.TryParse(“”,out i) false 3、s字符串中带有 空格。 int.TryParse(“1 “,out i) true int.TryParse(” 1”,out i) true int.TryParse(” 1 “,out i) true int.TryParse(“1 2”,out i) false 4、非数字型字符串 肯定是 false了。 5、在数据库的操作中,经常会遇到了 DBNull int.TryParse(System.DBNull,out i) “System.DBNull”是一个“类型”,这在给定的上下文中无效 int.TryParse(System.DBNull.Value,out i) 与“int.TryParse(string, out int)”最匹配的重载方法具有一些无效参数 int.TryParse(System.DBNull.Value.ToString(),out i) false
判断一个输入框是否为整数 int baseNum = default(int); if (!int.TryParse(txtBaseNum.Text, out baseNum)) { MessageBox.Show("请输入一个整数。"); return; }
//语法:int.TryParse(str, out res) int res = 1; int i = 3; string str = ""; if(int.TryParse(str, out res)){ //因为str是字符串类型,所以此次转换肯定是失败的,失败返回false //所以不会进来循环内部 //由于执行失败,所以res的值是0 } if(int.TryParse(i, out res)){ //因为i是int类型,所以此次转换是成功的,成功返回true //所以会进入到循环内部 //由于执行成功,所以res的值是i,也就是3 } ———————————————— 版权声明:本文为CSDN博主「Dear_BigTiger」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Dear_BigTiger/article/details/81033844
总结:TryParse可以为我们的程序减少报错概率,帮助我们准确的完成业务需求,也可以用来判断用户输入的时间、金额、数量等是不是符合规则
2、日期转换
1、【c#】将DataTable的时间精确到毫秒
Convert.ToDateTime(dt.Rows[0]["pay_time"]).ToString("yyyy-MM-dd hh:mm:ss.fff");
先将object类型的dt.Rows[0]["pay_time"]转换成DateTime,转换字符串的时候格式化。
现在的日期是12小时制的,有时候我们想要的是24小时制,这时候用“HH:mm:ss.fff”就实现了想要的效果。
2、2020-05-13T17:43:22 转化为正常时间
string sTime1 =‘2020-05-13T17:43:22 ’
string sTime = Convert.ToDateTime(sTime1).ToString();
2、日期型转换成字符型
C#时间格式 tostring、toshortdatestring、toshorttimestring
C#日期格式化
三、变量常量
常量
1、常量是使用 const 关键字来定义的 。定义一个常量的语法如下:
const <data_type> <constant_name> = value;
public const int c1 = 5;