C# 变量类型
- sbyte
- byte
- short
- ushort
- int
- uint
- long
- ulong
- float
- double
- decimal
- char
- bool
- string
switch
默认不能穿透,但是也必须有break用于结束。
显式转换
显式转换时默认unchecked,可以调用checked方法去调用。
显式转换可以用括号或者Convert类的方法。
使用as运算符,不能转换返回null,但是as方法不能转换为不能为null的基本类型。
枚举
枚举使用基本类型。
foreach
foreach(int item in items){
WriteLine(item);
}
多维数组
多维数组
int[,] itemsMatrix=new int[3,4];
访问
itemMatrix[3,4];
锯齿数组
int [][] itemMatrix=new int[2][];
itemMatrix[0]=new int[3];
itemMatrix[1]=new int[4];
引用
- ref: 在引用前需要赋值。
int a=0;
Increase(ref a)
- out: 在引用前不需要赋值,实际上,也无法赋值,传入的是新值。
static void OutTest(out int a)
{
a = 20;
}
static void Main(string[] args)
{
OutTest(out int a);
Console.WriteLine(a);
}
委托
关键字delegate, 定义委托后,可以传入方法进行执行。
委托通常作为事件的类型使用。
属性
基本写法
private int c;
public int C
{
get
{
return c;
}
set
{
c = value;
}
}
自动属性
public int Value{
get;
set;
}
get和set可以选择性写一个,表示只读或者仅可写,自动属性可以添加默认值如下:
public int Value{
get;
set;
}=0;
继承和多态
隐藏基类成员
不加override则会隐藏,但是会警告,使用new 关键字修饰方法可以直接隐藏。用new覆盖的方法和用override重写的方法,其主要区别是多态时的调用区别。重写会改变父类型的方法,即使用父类型调用子类型实例的该方法时运行子类型的方法,而覆盖则不会。
调用基类方法
可以用base
识别类型
typeof()
is
c# 6.0后可以用if(object is Type reNameObject)这种形式去使用is以更方便的开发。
运算符重载
也可以通过实现一些方法来进行,比如,继承Comparable类并实现CompareTo方法。
可空类型
用于基本类型:如int?
??
op1??op2
等价于
op1==null?op2:op1
另一种常见做法是,在c# 6.0里
if(a!==null) a.method();
可简写为
a?.method();
单独说一下,对于事件,在过去
if(myEvent!=null) myEvent();
现在c# 6.0可以写成
myEvent?.Invoke();
初始化器
用{}表示,内容为变量名=赋值。
也可以用于给集合类初始化,按顺序即可。
例如:
class Connection
{
//事件声明
//EventHandler是系统自建的用于处理事件的委托
public event EventHandler<MessageArrivedEventArgs> MessageArrived;
public String Name { get; set; } = "Default Connection";
private Timer pollTimer;
public static Random random = new Random();
public Connection()
{
pollTimer = new Timer(100);
//达到时间间隔时用CheckForMessage方法处理事件。(类型EvenHandler<MessageArrivedArgs>已经隐式转换)
pollTimer.Elapsed += CheckForMessage;
}
}
可以这样初始化
Connection connection = new Connection { Name = "First Connection" };
类型推断
var(同C++ auto),实际应用中非常广泛。
可选参数
Optional 修饰 或者 默认值为false
命名参数
传参时用参数名:参数格式传,建议使用时全部使用命名参数
Lambda
类似于java8的lambda,但是不限制于特定接口才能运用lambda,自由度很大。
public void Connect() => pollTimer.Start();