C#2 - 变量及类型转换

突然发现C#的基础变量比想象中的多

Demo1 声明及输出变量

考虑以下变量为所需和所求的变量,demo代码会展示如何声明变量以及计算所需变量。

需求:

变量
手机价格 5000
数量 200
折扣 0.04
总价
折后价格

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyFirstProject
{
class Program
{
static void Main(string[] args)
{
double mobilePrice = 5000;
short quantity = 200;
double discount = .04;
double discountedPrice = mobilePrice * (1 - discount);
double totalPrice = discountedPrice * quantity;

Console.WriteLine("折后价={1}\n总价={0}", totalPrice, discountedPrice);
}
}
}

运行结果如下:

其中值得注意的是,在Console.WriteLine("折后价={1}\n总价={0}", totalPrice, discountedPrice);行中,{0}指代的是totalPrice,而{1}指代的是totalPrice


变量及数据类型

变量可以被看作是一个安放数据的容器,存放一个小的数据值就用一个小容器的话,就可以有效的利用内存。

从C# 2010 - 目前的基础值:

类型 描述 范围 默认值
byte 8 位无符号整数 0 到 255 0
sbyte 8位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
ushort 16 位无符号整数类型 0 到 65,535 0
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
long 64 位有符号整数类型 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
double 64 位单精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
decimal 128 位精确的十进制值,28-29 有效位数 0.0M
bool 布尔值 True 或 False False
char 16 位 Unicode 字符 U +0000 to U +ffff ‘\0’

类型转换

在VS中修改和添加以下代码:

  1. 添加

    1
    2
    int currentQuantity = quantity;
    Console.WriteLine("当前数量{0}", currentQuantity);

    运行代码,console上将会打印出当前数量200

  2. 修改double discountedPrice = mobilePrice * (1 - discount);int discountedPrice = totalPrice;

    注意VS中会出现红线报错提示,build solution也会出现以下报错信息:

    ct\MyFirstProject\Program.cs(22,35,22,45): error CS0266: Cannot implicitly convert type ‘double’ to ‘int’. An explicit conversion exists (are you missing a cast?)

  3. 添加int result = totalPrice * discount;,同样,VS中会出现红线报错提示,build solution也会出现以下报错信息:

    ct\MyFirstProject\Program.cs(22,35,22,45): error CS0266: Cannot implicitly convert type ‘double’ to ‘int’. An explicit conversion exists (are you missing a cast?)

注意,int32 位有符号整数类型,而short16 位有符号整数类型,将一个小的变量转换成大的变量,C#完成自动转化,是不需要特意去注明的,这种也被称为implicit type convertion。而double64 位单精度浮点型,精准度比起int要高,因此当转换的时候,会失去精准度,所以C#会要求对其声明,如int discountedPrice = (int) totalPrice;,以免意外转换而失去数据的精准度,这也被称之为explicit type conversion

更加形象的理解就是,比起double来说,int就是一个小一点儿的杯子,当把小的杯子里的水倒到大的杯子里时,并不会出现任何的问题,编译其能够帮助完成。但是将double里的水倒入int的杯子时,多的水就有可能会漏的到处都是,这种情况下,就需要编程人员特别注明。


类型转换Demo

以下代码中,会报错的代码已经被注释掉了,可以取消注释查看报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace MyFirstProject
{
class Program
{
static void Main(string[] args)
{
double doubleValue = 50;
Console.WriteLine("int到double的自动转换: " + doubleValue);
// 反之无法自动转换
//int intValue0 = 5.5;

int intValue1 = (int)(5.5);
Console.WriteLine("声明double对int的转换: " + intValue1);

int intValue2 = Convert.ToInt32(5.5);
Console.WriteLine("声明double对int的转换2: " + intValue2);

string stringValue1 = "10";
// string是引用类型,int是基础类型,无法完成自动转换
//int intValue3 = stringValue1;
// 直接声明也会报错
//int intValue4 = (int)(stringValue1);

// 必须要用Convert.ToInt32()完成转换
int intValue5 = Convert.ToInt32(stringValue1);
Console.WriteLine("String对int的转换: " + intValue5);
}
}
}

Reference

C# - Data Types

-------The end of this article  Thank you for your reading-------
0%