您的位置:首页 > 编程语言 > C#

【C#】基础知识—数据类型、数据类型转换

2016-03-02 20:35 1641 查看
一、 数据类型

C#中的数据类型根据定义可以分为两种:一种是值类型,一种是引用类型。这两种类型的差异就在于数据的存储方式,值类型直接存储数据,而引用类型则存储实际数据的引用,程序通过此引用找到真正的数据。

1. 值类型

 值类型

 值类型直接存储数据,主要包括:整数类型、浮点类型以及布尔类型(true或者false)等。值类型在堆栈中进行分配,因此效率很高,使用值类型主要的目的是为了提高新性能。值类型具有如下的特性

 1)值类型变量都存储在堆栈中;

 2)访问值类型变量时,一般都是直接访问其实例;

 3)每个值类型变量都有自己的数据副本,因此对一个值类型变量操作不会影响其他变量;

 4)复制值类型变量时,复制的是变量的值,而不是变量的地址

 5)值类型变量不能null,必须具有一个确定的值;

值类型是从System.ValueType类继承而来的类型。

2. 引用类型

引用类是构建C#应用程序的主要对象类型数据,引用类型的变量又称作对象,可存储对实际数据的引用。C#支持两个预定义的引用类型object和string。

图片:

注意:尽管string是引用类型,但如果用到了相等运算符(== 和 !=),则表示比较string对象<比较的是内存>(而不是引用)的值。

在运用程序执行的过程中,引用类型以new创建对象实例,并且存储在堆栈中。堆栈是一种由系统弹性配置的内存空间,没有特定大小及存活时间,因此可以被弹性地运用于对象的访问,引用类型具有如下特征:

 1)必须在托管堆中为引用类型变量分配内存;

 2)必须使用new关键字来创建引用类型变量;

 3)在托管堆中分配的每一个对象都有与之相关联的附加成员,这些成员必须被初始化;

 4)多个引用类型变量可以引用同一对象,这种情形下,对一个变量的操作会影响另一个变量所引用的同一对象;

 5)引用类型被赋值前都是null

所有称作类的都是引用类型,主要包括类、接口、数组和委托等,

二、变量

1. 变量代表一块内存空间,我们可以通过变量名称向内存存\取数据。有变量就不需要我们记忆复杂的内存地址。

// 要在计算机中存一个数字1000,需要两句话
int a;     // 开一个放数字的空间
a = 1000;  // 把1000放进去

2. 向内存申请一块内存空间的语法:

数据类型  变量名;
3. char: 字符型  只能存储一个字符,并且存储的这个字符要求用单引号引起来。
4. string类型:字符串。就是把0个或1个或多个字符连接起来。字符串要求用双引号引起。

5. double: 关键字表示存储64位浮点值的简单类型。(标识符)默认情况下,赋值运算符右侧的实数被视为double。但是,如果希望整数被视为double,请使用后缀d或者D。

6. decimal:关键字表示128位数据类型。同浮点数相比,decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。如果希望实数被视为decimal类型,请使用后缀m或者M。

decimal money = 300.5m;   // 没有后缀的话,数字被默认是double类型
注意:在浮点型和decimal类型之间不存在隐式转换;因此,必须使用强制类型转换在这两种类型之间进行转换。
7. 命名规则:

 1> 必须以“字母”、"_"或者“@”符号开头

 2> 后面可以跟任意字母、数字、下划线

3项注意:

 3> 取的变量名不要c#与系统中的关键字冲突

 4> 在c#中,大小是敏感的

 5> 同一个变量名不允许重复定义 pk 重复赋值(主要是不严谨?还有就是)int a = 1;    int a = 2;(定义)   a = 3;(赋值)

定义变量时,变量名要有意义      (注意给字段命名时候:前面必须加下划线_studentAge;)

 6> c#变量命名编码规范— — Camel(骆驼)命名法 ---- 首个单词的首字母字母小写,其余单词的首字母大写;如:studentAge;

 7> Pascal命名规范: 每一个单词第一个字母都要用大写;; 如:StudentName;

 8> 如果使用到英文单词的缩写,全部用大写; 如:stuA;

三、 赋值运算

1. 一个方法中,一般情况下变量只能定义一次(先这么认为),但是可以多次赋值,再次赋值时,会把变量中原有的值给覆盖掉。

2. “+“在c#中有两个意义

 1> 是数学的加法运算:两边参与加法运算的数据类型为数字类型,则”+“表示数学上的加法的意义;

 2> 是连接的意思:两边参与加号运算的数据,有一个是字符类型,那么这个+"号就是连接的意义;

Console.WriteLine("我叫" + name + ", 今年" + age + "岁了, 我的工资是" + salary + " 元 ");  // 我叫..,今年..岁了,我的工资是...
// 解释:"我叫" + name  然后后面的 + 就是连接后面引号内的字符串内容 “, 今年”   后面的解释一样
Console.WriteLine("我叫" + name );    // 我叫name
Console.WriteLine("我叫" + name, "今年" +age+ "岁了");  // 我叫.. 后面的不会输出,由于没有连字符,没法输出后面的


3. 使用占位符输出(有些情况下可以替换“连接符”

第一个变量/字符串中可以使用占位符。

占位符由{数字}组成,数字由0开始编号:第一个占位符:{0}     第二个占位符:{1}   第三个占位符:{2} .........

Console.WriteLine("我叫{1}, 今年{1}岁了, 我的工资是{2}", name, age, salary);
Console.WriteLine("我叫{1}, 今年{1}岁了, 我的工资是{2}", name, age); // 语法上面没有错误,不过运行时候会有错误
Console.WriteLine();  有多个参数时,输出的都是第一个参数中的内容,从第二个参数开始,都是用来替换第一个参数中的占位符的值,所以从第二个参数开始,要不要输出, 就要看第一个参数中有没有相关的占位符。
Console.WriteLine("{0}我叫" + name, "今年" +age+ "岁了", "我的工资是" +salary );  // 今年..岁了,我叫..
Console.WriteLine("{0}我叫" + name, "我的工资是" + salary); // 我的工资是..., 我叫..{0}输出的是我的工资是....;因为name后面没有连接符
四、变量的交换
1. 借助第三变量来交换位置

int a = 10;
int b = 20;
int temp;

temp = a;
a = b;
b = temp;

Console.WriteLine("a = {0}, b = {1}", a, b);     // 使用占位符输出
Console.WriteLine("a= " + a + ", b=" + b);       // 使用一般输出
Console.ReadKey();
2. 在学习一句话
Console.ReadLine();    // 返回的是一个字符串,需要你用string接收
这句话的作用:用户从键盘上输入一句话。当程序执行到下面这个话,就会暂停,然后等待用户从键盘输入一句,按回车程序将继续执行。
string input;
Console.WriteLine("hello world");
input = Console.ReadLine();
Console.WriteLine("输入的内容是: " +input);      // 一般格式
Console.WriteLine("输入的内容是: {0}", input);   // 占位符格式
// printf("输入的内容是: %s", input);            // C语言 C++中格式
Console.ReadKey();

五、数据类型的转换

数据类型的转换是讲一种数据类型转换成另一种数据类型,可以是隐式转换或者显式转换。

隐式转换:不需要声明就能进行的转换。进行隐式转换时,编译器不需要进行检查就能安全地进行转换。

显示转换:也称作强制类型转换,它需要在代码中明确地声明要转换的类型(说明:由于显示转换包括所有的隐式类型转换和显示类型转换,因此可以使用强制转换表达式从任何数值类型转换为任何其他的数值类型)

算术运算符:

1. c#中有五个算术运算符,他们是二元运算符,要求:参与的两个操作数的类型必须相同,并且经过运算后的结果也与操作数的类型相同。

2. 优先级:先乘除,后加减,有括号的先算括号里的,相同级别的从左往右运算(小括号可以用来改变相关的运算顺序,可以无限的套用)

转换:

3. 类型自动转换:(隐式转换方式)

 1> 参与运算(算术运算和赋值运算)的操作数和结果类型必须一致。当不一致时,满足下面条件时,系统自动完成类型转换。(发生自动转换的条件)

  1.1 两种类型兼容:

  例如:int 和 double兼容

  1.2 目标类型大于源类型 (小范围的转化为大范围,不丢失精度的前提下)

  例如:double > int

 2> 对于表达式

 如果一个操作数为double型,则整个表达式可提升为double型

4. 强制类型转换 

 1> 语法:(数据类型名)待转换的值;

int i = (int)22.2;
Console.WriteLine(i);
结果:22  丢失了精度
 2> 系统不会自动转换的,用户根据自己的需求进行转换。这个时候就是需要进行强制类型转换。

 3> 有可能丢失精度,有可能转换不成功,超出表示范围了。

注意:强制类型转换或者隐式转换的前提数据需是数字类型。

5. 类型转换 (一般用于字符串的类型)

Convert不再仅是内存级别的转换,而是考虑数据意义的转换。Convert是一个加工、改造的过程。

Convert.ToInt32(待转换的字符);

Convert.ToString、每种类型都还有.ToString()方法

一切类型都可以转换成string类型。

6. 装箱和拆箱

C#语言系统中有两个重要的概念,分别是装箱和拆箱,通过装箱和拆箱,任何值类型都可以被当做object引用类型来看。

 1> 装箱

装箱,实质上就是将值类型转换为引用类型的过程;

int i = 200;   // 声明一个值类型的变量
object obj = i;  // 对值类型变量进行装箱操作
案例:
public static void test()
{
int a = 2;
int b = 3;
a = b;   //
b = 4;   // a-3 b-4  值类型

int i = 200;
object obj = i; // 声明一个object类型obj,其初始化值为i
Console.WriteLine("first: i的值是{0}, 装箱之后的对象是{1}", i, obj); // 200  200

i = 100;
Console.WriteLine("second: i的值是{0}, 装箱之后的对象是{1}", i, obj);  // 100  200
Console.ReadLine();
}
上面的案例说明,值类型变量的值复制到装箱得到的对象中,装箱后改变值类型变量的值,并不会影响装箱对象的值。

 2> 拆箱

拆箱,实质上就是将引用类型转换为值类型的过程,拆箱的执行过程大致可以分为以下两个阶段:

 1)检查对象的实例,看它是不是值类型的装箱值;

 2)把这个实例的值复制给值类型的变量;

注意:在执行拆箱操作的时候,要符合类型一致的原则,否则会出现异常。

案例:

public static void test2()
{
int i = 12;
object obj = i;
Console.WriteLine("装箱操作:值为{0},装箱之后对象的值为{1}", i, obj);
int j = (int)obj;   // 执行拆箱操作    int64 i  = 64;     int64 j = (int32)obj; 是错误的
Console.WriteLine("拆箱曹组:拆箱对象为{0},值为{1}", obj, j);
Console.WriteLine();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息