数据类型
值类型
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。
值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True或False | False |
byte | 8位无符号整数 | 0到255 | 0 |
char | 16位Unicode字符 | U+0000到U+ffff | ‘\0’ |
decimal | 128位精确的十进制值,28-29有效位数 | ( − 7.9 × 1 0 28 到 7.9 × ) / 1 0 0 − 28 (-7.9\times10^{28}到7.9\times)/10^{0-28} (−7.9×1028到7.9×)/100−28 | 0.0M |
double | 64位双精度浮点型 | ( + / − ) 5.0 × 1 0 − 324 − ( + / − ) 1.7 × 1 0 308 (+/-)5.0\times10^{-324}-(+/-)1.7\times10^{308} (+/−)5.0×10−324−(+/−)1.7×10308 | 0.0D |
float | 32位单精度浮点型 | − 3.4 × 1 0 38 − + 3.4 × 1 0 38 -3.4\times10^{38}-+3.4\times10^{38} −3.4×1038−+3.4×1038 | 0.0F |
int | 32有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
sbyte | 8位有符号整数类型 | -128到127 | 0 |
short | 16有符号整数类型 | -32,768 到 32,767 | 0 |
uint | 32位无符号整数类型 | 0 到 4,294,967,295 | 0 |
ulong | 64位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 |
ushort | 16位无符号整数类型 | 0到65535 | 0 |
引用类型
引用类型不包含存储在变量中的实际数据,其指向的是一个内存位置。
内置的引用类型有:object、dynamic、string
-
对象(object)类型
是C#中所有数据类型的终极基类,可以被分配任何其它类型的值
当一个值类型转换为对象类时,被称为 装箱
当一个对象类型转换为值类型时,被称为 拆箱 -
动态(dynamic)类型
任何类型的值都可以存储在动态数据类型变量中,且这些变量的类型检查是在运行时发生的
dynamic <variable_name> = value;
dynamic d = 20;
- 字符串(string)类型
允许给连梁分配任何字符串值。字符串类型的值可以通过两种形式进行分配:@“” 和 “”
在""前加@:- 被称为逐字字符串,会将转义字符当做普通字符对待
- @字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内
string str = @"j\tlfjldgf
dfdfaf=""gkjrflsdjl""
"
指针类型
c#中的指针和C/C++d 指针相同
char* p;
类型转换
- 隐式类型转换
隐式是指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,且这些转换C#默认以安全方式进行转换,不会导致时间丢失。
byte b = 10;
int i = b; //系统会自动将byte转换为int
- 显示类型转换
即强制类型转换,在将一个较大范围的数据类型转为较小范围的数据类型,或者将一个对象类型转换为另一个对象类型,需要使用强制类型转换符号进行显式转换,强制转换会造成数据丢失。
int i = 10;
byte b = (byte)i;//显式转换,需要使用强制类型转换符号
int int_v = 123;
string string_v = int_v.ToString();//将int转换为字符串
- C#类型转换方法
方法 | 描述 |
---|---|
ToBoolean | 转换为布尔类型 |
ToByte | 转换为byte类型 |
ToChar | 转为字符类型 |
ToDateTime | 把字符串、整数类型转换为日期-时间结构 |
ToDecimal | 将浮点或整数类型转换为十进制类型 |
ToDouble | 转为double类型 |
ToInt16\32\64 | 转为16\32\64位的整数类型 |
ToSingle | 转为小浮点数类型 |
ToSbyte | 转为有符号字节类型 |
ToString | 转为字符串 |
ToType | 转为指定类型 |
ToUint16\32\64 | 转为无符号16\32\64位的整数类型 |
变量、常量及变量的作用域
变量
变量是用于存储和表示数据的标识符
类型 | 举例 |
---|---|
整数类型 | sbyte、byte、short、ushort、int、uint、long、ulong和char |
浮点类型 | float、double |
十进制类型 | decimal |
布尔类型 | true、false |
空字符串 | string |
空类型 | 可为空值的数据类型 |
动态类型 | dynamic |
- 变量定义
//定义变量
int i,j,k;
double d;
- 变量初始化
int d = 3,f = 5;
byte z = 22;
double pi = 3.1415926;
char x = 'x';
- 接受来自用户的值
// system 命名空间中console类提供了一个函数ReadLine() 但Console.ReadLine只接受字符串格式的数据
int num;
num = Console.ToInt32(Console.ReadLine());
-
Lvalues和Rvalues
- lvalue:lvalue表达式可以在赋值语句的左边或右边 变量
- rvalue:rvalue表达式只能从现在赋值语句的右边 值
变量作用域
在C#中,变量的作用域定义了变量的可见性和生命周期,通常用{}来定义
- 局部变量
//在方法、循环、条件语句等代码块中声明的变量是局部变量,它们只在声明它们的代码块中可见
void MyMethod()
{
int localVar = 10;//局部变量
}
//localVar 此处不可见
- 块级作用域
//在C# 7及以上版本中引入
{
int blockVar = 20;//块级作用域
}
//blockVar不可见
- 方法参数作用域
// 方法的参数也有其自己的作用域,它们在整个方法中都是可见的
void MyMethod(int parameter)
{
//parameter 在整个方法中可见
}
- 全局变量
//在类的成员级别定义的变量是成员变量,在整个类中可见 如果在命名空间中定义,那就在整个命名空间中可见
class MyClass
{
int memberVar = 30;//成员变量 在整个类中可见
}
- 静态变量作用域
//静态变量是在类上定义的 但其作用域也受限于其定义的类
class MyClass
{
static int staticVar = 40;//静态变量
}
- 循环变量作用域
//在循环中声明的变量
for (int i=0;i<5;i++)
{
//i仅在循环体内可见
}
常量
常量是固定值,程序执行期间不会改变,且可以是任何类型。
212 215u 0xFeeL 078 //都是合法常量 U L 分别表示unsigned long ul 表示 无符号long 0表示八进制 0x16进制
3.14159 514159E-5L//前是float常量 后是科学计数法()
- 字符常量中的转义字符
|转义序列| 表示字符 |
|–|–|
|\| \ |
| ’ | ’ |
|“|”|
|?|?|
|\a|Alert或bell|
|\b|退格键|
|\f|换页符|
|\n|换行符|
|\r|回车|
|\t|水平制表符 tab|
|\v| 垂直制表符 tab|
|\ooo|一到三位的八进制|
|\xhh…|一个或多个数组的十六进制数| - 定义常量
//使用const
const <data_type> <constant_name> = value;
using System;
public class ConstTest
{
class SampleClass
{
public int x;
public int y;
public const int c1 = 5;
public const int c2 = c1+4;
public SampleClass(int p1,int p2)
{
x = p1;
y = p2;
}
}
static void Main()
{
SampleClass mC = new SampleClass(11,22)
Console.WriteLine("x = {0} y = {1}",mC.x,mC.y)
Console.WriteLine("c1 = {0} c2 = {1}",SampleClass.c1,SampleClass.c2)
}
}
运算符
-
算术运算符
+ - * / 加减乘除
% 取模运算符 求余
++ 自增运算符
-- 自减运算符 -
关系运算符
== 等于 != 不等于 > 大于 < 小于 >=大于等于 <=小于等于 -
逻辑运算符
&& 且 || 或 !不是 非 -
位运算符
& 与 | 或 ^异或 -
赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单赋值运算符 | C=A+B 把A+B的值赋给C |
(+-*/ % & | ^)= | (+-*/ % & | ^)且 赋值运算符 | C+=A 相当于C=C+A 其余类推 |
<<= | 左移且赋值 | C<<=2 等同于 C=C<<2 |
>>= | 右移且赋值 | C>>=2 等同于C=C>>2 |
- 其他运算符
| 运算符 | 描述 |实例|
|–|–|–|
| sizeof() | 返回数据类型的大小 |sizeof(int)返回4|
| typeof() | 返回class类型 |typeof(StreamReader)|
| & | 返回变量的地址 |&a;将得到变量的实际地址|
| * | 变量的指针 |*a;将指向一个变量|
| ?: | 条件表达式 三目运算符 |如果条件为真? 则为X 否为Y (x=y)?x:y|
| is | 判断对象是否为某一类型 | if(Ford is Car)|
|as|强制转换,即使失败也不会抛出异常|Object obj = new StringReader(“Hello”);StringReader r=obj as StringReader;|