访问性
修饰符 | 描述 |
---|---|
public | 访问不受限制 |
protected | 只能在所属类或从它派生的类而来 |
internal | 只能在所属程序集内访问 |
protected internal | 只能在所属程序集内访问 或 才从所属派生的类中访问 |
private | 只能在所属类中访问 |
数据类型
类型推断
var:可以使用var代替实际的类型,编译器可以根据根据变量的初始值“推断”变量的类型。
常量
关键字:const
const int a = 100; //This value cannot changed
值类型和引用类型
值类型存储在堆栈中(stack)
引用类型存储在托管堆中(managed heap)
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。
//属于值类型
j = 20;
i = 20;
//以下是引用类型
class Vector
{
public
int value = 0;
}
class Program
{
static void Main(string[] args)
{
Vector x, y;
x = new Vector();
x.value = 30;
y = x;
Console.WriteLine(y.value+"\n");//输出为30
y.value = 50;
Console.WriteLine(x.value + "\n");//输出为50
}
}
引用类型
:::info
引用数据的需求
使用一个方法分配内存,来存储一些数据,并在方法退出后的很长一段时间内数据仍是可用的。
:::
arabel = new Customer();
- 它分配堆上的内存,以存储Customer对象
- (一个真正的对象,不只是一个地址)。
- 然后把变量arabel的值设置为分配给新Customer对象的内存地址。
- (它还调用合适的Customer()构造函数初始化类实例中的字段,但此处我们不必担心这部分)
:::danger 堆上分配内存的详细步骤(只需要了解)
- .NET运行库需要保存堆的状态信息,在堆中添加新数据时,这些信息也需要更新。
- 把一个引用变量的值赋予另一个相同类型的变量,就有两个变量引用内存中的同一对象了。 :::
当一个引用变量超出作用域时,它会从栈中删除,如上一节所述,但引用对象的数据仍保留在堆中,一直到程序终止,或垃圾回收器删除它为止,而只有在该数据不再被任何变量引用时,它才会被删除。
预定义的引用类型
对象(Object)类型
对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。
Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
object obj;
obj = 100; // 这是装箱
动态(Dynamic)类型
您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:
dynamic <variable_name> = value;
//例如:
dynamic d = 20;
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
字符串(String)类型
字符串(String)类型允许您给变量分配任何字符串值。
字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
//例如:
String str = "runoob.com";
//一个 @引号字符串:@"runoob.com";
//C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:
string str = @"C:\Windows";
//等价于:
string str = "C:\\Windows";
//@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
string str = @"<script type=""text/javascript"">
<!---->
</script>";
string s1 = "a string";
string s2 = s1;
Console.WriteLine("s1 is"+s1);
Console.WriteLine("s2 is" + s2);
s1 = "another string";
Console.WriteLine("s1 is now"+s1);
Console.WriteLine("s2 is now"+s2);
用户自定义引用类型有: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 |
bool类型
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True 或 False | False |
字符类型
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | ‘\0’ |
转义字符
\u 转化为Unicode
\n 下一行
@作用:使引号里面的字符原样输出,不需要判断是否为转义字符。
数字字面值
字面值 | 位置 | 说明 |
---|---|---|
U | 后缀 | unsigned int |
L | 后缀 | long |
UL | 后缀 | unsigned long |
F | 后缀 | float |
M | 后缀 | 十进制(货币) |
0x | 前缀 | 十六进制数字,允许使用0-F |
0b | 前缀 | 二进制数字,允许使用0-1 |
true | N/A | 布尔值 |
Flase | N/A | 布尔值 |
变量格式化输出
如果宽度不足6个字符,则以空格进行补足。
int numeber = 100;
Console.WriteLine("这个是 {0}",numeber);
//0表示该处有个变量,所对应的变量为numeber,占位符的形式可以有多个占位符
//占位符的好处是可以添加各种控制的信息
int i, j;
i = 100;j = 200;
Console.WriteLine("这个是 {0},{1}",i,j);
Console.WriteLine("这个是"+ numeber);//
double pi = 3.1415926;
Console.WriteLine("{0:#.00}\n",pi);//占位符
Console.WriteLine("{0:#.000}\n", pi);
Console.WriteLine("{0:#.000}\n", pi);
Console.WriteLine("{0:#.0000}\n", pi);
枚举类型
public enum Days
{
Sumday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
saturday,
}