访问性

修饰符 描述
public 访问不受限制
protected 只能在所属类或从它派生的类而来
internal 只能在所属程序集内访问
protected internal 只能在所属程序集内访问 或 才从所属派生的类中访问
private 只能在所属类中访问

数据类型

类型推断

var:可以使用var代替实际的类型,编译器可以根据根据变量的初始值“推断”变量的类型。

常量

关键字:const

  1. const int a = 100; //This value cannot changed

值类型和引用类型

数据类型 - 图1
值类型存储在堆栈中(stack)
引用类型存储在托管堆中(managed heap)
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。

  1. //属于值类型
  2. j = 20;
  3. i = 20;
  4. //以下是引用类型
  5. class Vector
  6. {
  7. public
  8. int value = 0;
  9. }
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. Vector x, y;
  15. x = new Vector();
  16. x.value = 30;
  17. y = x;
  18. Console.WriteLine(y.value+"\n");//输出为30
  19. y.value = 50;
  20. Console.WriteLine(x.value + "\n");//输出为50
  21. }
  22. }

引用类型

:::info 引用数据的需求
使用一个方法分配内存,来存储一些数据,并在方法退出后的很长一段时间内数据仍是可用的。 :::

arabel = new Customer();

  • 它分配堆上的内存,以存储Customer对象
    • (一个真正的对象,不只是一个地址)。
  • 然后把变量arabel的值设置为分配给新Customer对象的内存地址。
    • (它还调用合适的Customer()构造函数初始化类实例中的字段,但此处我们不必担心这部分)

:::danger 堆上分配内存的详细步骤(只需要了解)

  1. .NET运行库需要保存堆的状态信息,在堆中添加新数据时,这些信息也需要更新。
  2. 把一个引用变量的值赋予另一个相同类型的变量,就有两个变量引用内存中的同一对象了。 :::

当一个引用变量超出作用域时,它会从栈中删除,如上一节所述,但引用对象的数据仍保留在堆中,一直到程序终止,或垃圾回收器删除它为止,而只有在该数据不再被任何变量引用时,它才会被删除。

预定义的引用类型

对象(Object)类型

对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。
Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。

  1. object obj;
  2. obj = 100; // 这是装箱

动态(Dynamic)类型

您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:

  1. dynamic <variable_name> = value;
  2. //例如:
  3. dynamic d = 20;


动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。

字符串(String)类型

字符串(String)类型允许您给变量分配任何字符串值。
字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

  1. //例如:
  2. String str = "runoob.com";
  3. //一个 @引号字符串:@"runoob.com";
  4. //C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:
  5. string str = @"C:\Windows";
  6. //等价于:
  7. string str = "C:\\Windows";
  8. //@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
  9. string str = @"<script type=""text/javascript"">
  10. <!---->
  11. </script>";
  12. string s1 = "a string";
  13. string s2 = s1;
  14. Console.WriteLine("s1 is"+s1);
  15. Console.WriteLine("s2 is" + s2);
  16. s1 = "another string";
  17. Console.WriteLine("s1 is now"+s1);
  18. Console.WriteLine("s2 is now"+s2);



数据类型 - 图2

用户自定义引用类型有:class、interface 或 delegate。我们将在以后的章节中讨论这些类型。

NET类型(数据类型)

整形

类型 描述 范围 默认值
有符号
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
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
无符号
byte 8 位无符号整数 0 到 255 0
ushort 16 位无符号整数类型 0 到 65,535
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0


数字分隔符

c#7提供了数字分割符(增加了可读性,不添加任何功能)。
long x = 0x123_456_789_cdef

补码

整型是以补码表示的。正数的补码是它的本身,求负数补码的方法是:
1. 将该数的绝对值表示成二进制形式。
2. 按位取反(即1变0,0变1)
3. 再加1
4. 1 0101 0111

二进制值

c#7中可以将二进制值分配给整数类型。(在数字前加上0b)作为前缀(二进制值是C#7中新增的功能)
uint binary = 0b1111_1110_1010

浮点类型

类型 描述 范围 默认值
double 64 位双精度浮点型 (+/-)5.0 x 10 到 (+/-)1.7 x 10 0.0D
float 32 位单精度浮点型 -3.4 x 10 到 + 3.4 x 10 0.0F

代码中对某个非整数值进行硬编译,
编译器嘉定变量为double,
如果想指定float,则在数字后加上字符F(或f):float f = 12.3F;

decimal

类型 描述 范围 默认值
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 10 到 7.9 x 10) / 10 0.0M


decimal d = 12.30M;

bool类型

类型 描述 范围 默认值
bool 布尔值 True 或 False False

字符类型

类型 描述 范围 默认值
char 16 位 Unicode 字符 U +0000 到 U +ffff ‘\0’

转义字符

  1. \u 转化为Unicode
  2. \n 下一行
  3. @作用:使引号里面的字符原样输出,不需要判断是否为转义字符。

数字字面值

字面值 位置 说明
U 后缀 unsigned int
L 后缀 long
UL 后缀 unsigned long
F 后缀 float
M 后缀 十进制(货币)
0x 前缀 十六进制数字,允许使用0-F
0b 前缀 二进制数字,允许使用0-1
true N/A 布尔值
Flase N/A 布尔值

变量格式化输出

如果宽度不足6个字符,则以空格进行补足。

  1. int numeber = 100;
  2. Console.WriteLine("这个是 {0}",numeber);
  3. //0表示该处有个变量,所对应的变量为numeber,占位符的形式可以有多个占位符
  4. //占位符的好处是可以添加各种控制的信息
  5. int i, j;
  6. i = 100;j = 200;
  7. Console.WriteLine("这个是 {0},{1}",i,j);
  8. Console.WriteLine("这个是"+ numeber);//
  9. double pi = 3.1415926;
  10. Console.WriteLine("{0:#.00}\n",pi);//占位符
  11. Console.WriteLine("{0:#.000}\n", pi);
  12. Console.WriteLine("{0:#.000}\n", pi);
  13. Console.WriteLine("{0:#.0000}\n", pi);


数据类型 - 图3

枚举类型

  1. public enum Days
  2. {
  3. Sumday,
  4. Monday,
  5. Tuesday,
  6. Wednesday,
  7. Thursday,
  8. Friday,
  9. saturday,
  10. }