命名空间
using System
namespace spacename
{class c1
{members}
class2
{members}
......
}
命名空间由namespace关键字定义,其他程序可以引用该命名空间,引用方式也为使用using语句。使用using语句可以从基类库中引用已有的库。
格式化输出
Console.WriteLine("Hello world!"); // output a string with enter
Console.Write("Hello world!"); // output a string without enter
// use placeholder
Console.WriteLine("{0}+{1}+{2}={3}",10,20,30,60) // output 10+20+30=60
Console.WriteLine("{1}+{0}+{2}={3}",10,20,30,60) // output 20+10+30=60
// use placeholder and formatted symbol
Console.WriteLine("{0:c}+{1:d6}+{2:f3}={3:E}",10,20,30,60) // output $20+000010+30.000=6.000000E+001
格式化符号有:
符号 | 含义 |
---|---|
C/c | 格式化货币 |
D/d | 格式化十进制数,还可制定最小填充位数,前补零 |
E/e | 指数记数法,大小写均转换,显示输入的模样 |
F/f | 小数记数法,保留小数位数 |
G/g | 格式化为定点或指数格式 |
N/n | 基本的数值化,带逗号 |
X/x | 转化为十六进制,输入X显示X,输入x显示x |
变量、常量
C#是大小写敏感的,命名约定有两种:
PascalCase:重要且高级,如Console/WriteLine()
camelCase:次要且低级,如int/struct
变量的种类
C#中有静态变量、非静态变量、数组元素、值参数、引用参数、输出参数、数组参数、局部变量八种类别,没有全局变量
class Program // class
{
int x=1; // x is non-static variable
public static int y=2; // y is static variable
void f(int[] s,int val,ref int i,out int j) // array s, value parameter val, reference parameter i, output parameter j
{
int w=2; // w is local variable
j=x+y+i+w; // j is output variable
}
static void Main()
{}
}
规则:
- 只能在类型中定义静态变量,不可在函数中定义
- 静态成员不可访问非静态成员;非静态成员可以访问静态成员
- 类内调用,可以直接调用;类间调用,使用点运算符
- 静态变量生存周期为源程序(类似 全局变量 );非静态变量生存周期为一个函数调用过程
局部变量:在独立块中定义和使用的变量,只在该范围内有效,不会被自动初始化,没有默认值
常量
modifier const type var_name;
public const double PI=3.1415926;
类型和字量
字量是类型的字面值,与常量在本质上相同,更加简单,不用声明,直接写出即可。
type var_name;
type var_name=initial_value;
通常type有:
类型 | 含义 |
---|---|
bool | 布尔值,true/false |
byte/sbyte/short/ushort/int/uint/long/ulong | 整型,位数不同,加u表示无符号,表达范围不同 |
float/double/medical | 单/双/银行精度浮点型,medical定义的字变量之后需要加后缀M |
char | 字符变量,可以是普通字符、转义字符、十六进制转义字符、Unicode字符 |
string | 字符串变量,正则字符串字量可含转义字符;逐字字符串字量双引号内均视为字符串,之前用@开头引导 |
null | 引用类型的空字量,可赋值给引用类型;赋值给非引用类型,可用int? i=null的可空类型语法 |
类型
类型有多种分类方法,主要以值类型和引用类型进行区分。
值类型 | 引用类型 |
---|---|
简单类型、枚举类型、结构类型 | 类类型、接口类型、委托类型、数组类型、字符串类型 |
值类型是栈中直接存储值;引用类型是栈中存放堆中的地址。引用类型在发生改变时,可能使得其他任何从该地址引用的引用类型发生变化
值类型
类型 | 描述 |
---|---|
有符号/无符号整形 | sbyte/short/int/long(8,16,32,64);byte/ushort/uint/ulong(8,16,32,64) |
Unicode字符型 | char |
IEEE浮点型 | float/double(32,64) |
高精度小数型 | demical(128) |
布尔型 | bool |
枚举类型 | enum E{···} |
结构类型 | struct S{···} |
引用类型
类型 | 描述 |
---|---|
类类型:object | 其他所有类型的基类 |
类类型:string | Unicode字符串 |
类类型:class | 用户自定义 |
接口类型 | 用户自定义,interface I{···} |
数组类型 | 单维/多维,int[]与int[,] |
委托类型 | 用户自定义 delegate T D(···) |
枚举和结构
枚举类型:相同数据类型的集合,不能定义在函数中。是一组数字的映射
结构类型:不同数据类型的集合,不能定义在函数中。与类类型相似,但它的实例化依然是值类型,而不是类类型的引用类型
using System;
class Program
{
struct Point // define a struct
{
public int x,y;
public Point(int x0,int y0)
{ x=x0; y=y0;
}
}
static void Main()
{
Point p1=new Point(10,10);
Point p2=p1;
p1.x=100;
Console.WriteLine("p2.x={0},p2.y={1}",p2.x,p2.y);
}
}
上述例子后,p2.x仍为10,不会变;而当point是一个类时,p2.x会变成100
数组
int[] a=new int[2]{6,4};
int[] a=new int[]{6,4};
int[] a={6,4}
// original express
int[] a;
a=new int[2];
a[0]=6; a[1]=4;
// more dimension
int[,] b=new int[3,2] {{1,2},{3,4},{5,6}}
b[0,1]=25
// jagged array
int[][] c=new int[3][];
c[0]=new int[2]{1,2};
c[1]=new int[3]{2,3,4};
c[2]=new int[2]{6,7};
变量转换
- 隐式转换
范围小–>范围大转换 - 强制类型转换
在类型前加需要转换的类型 - Tostring()函数
把各类变量转化为string变量 - Convert类
使用Convert.To转化为各种类型
// casts
double d=2.2;
int i=(int)d;
// ToString()
int i=250;
string s=i.ToString();
// Convert
double r=Convert.ToDouble("3.14");
运算符
运算符 | 含义 | 示例 |
---|---|---|
+/- | 加/减 | int a=3+2 (5) |
++/– | 自增/自减 | i++ |
*// | 乘/除 | float c=4/3*6 (6) |
% | 取余 | int b=7%3 (1) |
~ | 按位非 | a=~00101010 (11010101) |
& | 按位与 | int a=42&15 (10)(00001010) |
[] | 数组/索引器/特性 | array[i]/h[“a”] |
new | 创建对象 | object obj=new object() |
sizeof | 字节数 | sizeof(double) |
typeof | 类型 | System.Type dt=tpyeof(double) (dt=System.Double) |
checked | 判断是否溢出 | int a=int.MinValue; int c=checked(a–) (抛出异常) |
unchecked | 取消检查 | int a=int.MinValue; int c=unchecked(a–) (不抛出异常但无效) |
参考:《面向对象和组件的C#编程》 李军