您的位置:首页 > 编程语言 > C语言/C++

c# 语法笔记 适用于从C++转过的,用于速查

2012-12-20 19:01 337 查看
c# 语法笔记
适用于从C++转过的,用于速查

来自xsoap 肥皂的专栏

一 基本语法

1 定义字符串用@前缀,可以不用转移符
2 switch支持字符串
3 checked unchecked 可以溢出检查上下文
int oneInt = 10;
byte oneByte8 = checked((byte)oneInt);

默认是unchecked的
4 数组定义
const int arraySize = 5;
int [] myIntArray = new int[arraySize] {5,9,10,2,99}
多维数组 用逗号区分多维
double[,] hillHeight = new double [3,4];
double[,] hillHeight = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};

数组的数组 每个数组数目可不同,锯齿数组
int [][] jaggedIntArray;

每个数组是个对象,可以打.号调用调用函数
int [] intArray = new int[10];
int len = intArray.Length;

二 函数定义

1 参数数组 关键字 params
能定义(只能)一个参数数组,并且在参数最后

可以传任意数目相同参数,变参
static int SumVals(params int[] vals)
{
int sum = 0;
foreach(int val in vals)
{
sum += val;
}

return sum;
}

static void Main(string[] args)
{
int sum = SumVals(1,5,3,4);
Console.WriteLine("Summed values = {0}",sum);
Console.Readkey();
}

2 引用参数 用关键字ref 传值
static void ShowDouble(ref int val)
3 输出参数 用关键字out
作用和ref一样,但有两个重要区别
把未赋值的变量用作ref 参数是非法的,但可以把未赋值的变量用作out参数
在函数中使用out参数时,out参数必须看作是还未赋值的

三 委托
委托定义和C++ 函数指针定义一模一样。
delegate double ProcessData(double p1,double p2);

四 调试
向Output窗口打消息
Debug.WriteLine() 仅Debug下
Trace.WriteLine() Release 也有
五 类
1 结构是值类型,对象是引用类型
struct myStruct{}
myStruct structA = new myStruct();
myStruct structB = structA;//是把值复制了

2 sealed 关键字 制定类不能继承,只能实例化
3 接口的定义用关键字interface
4 定义的类默认最根部继承自 object ,不用显示写代码继承
5 比较类型 ,GetType 函数、 typeof 关键字
if (myObj.GetType() == typeof(MyComplexClass))

6 构造函数 ,调用基类构造函数用 base 关键字,调用类本身其他构造函数用this

7 定义成员变量
访问级别 internal
关键字 readonly = c++ 里的const 只能在构造函数的过程中赋值,或直接赋值
class MyClass
{
public readonly int MyInt = 17;
}

关键字 const = c++ 里的 (static const) 默认是静态的
8 定义函数
重写基基类主法要加关键字 override

9 定义属性

get set 可以单独控制访问权限
set 中用value关键字来标识传过来的值

class MyClass
{
private int MyInt = 17;

public int MyintProp
{
get
{
return myInt;
}
protected set
{
myInt = value
}
}

10 类函数覆盖
如果父类是虚函数,子类同名函数用override ,如不是虚函数 用关键字 new

11 关键字 partial 部分类定义
类可以定义在多个文件中

public partial class MyClass : IMyInteface1
{}

public partial class MyClass : IMyinteface2
{}



public partial class MyClass : IMyInteface1,IMyinteface2
{}

是等价的

partial 也可部分方法定义,一部分定义,一部分实现

12 类成员变量可以直接赋值?

13 支持运算符重载
函数定义为static
public static AddClass1 Operator + (AddClass1 op1,AddClass1 op2);

六 浅复制和深复制
简单地按照成员复制对象可以通过调用派生于System.Object 的 MemberwiseClone()方法来完成。
该方法提供的复制功能称为浅度复制

实现ICloneable接口 ,实现Clone()方法 实现深复制

七 集合类
1 定义的简单数组 都是System.Array 类型的,可以调用其 .GetLength等方法
int [] myIntArray = new int[arraySize]

2 继承CollectionBase 可以实现一个自定义集合类
重载 索引符

public Animal this[int animalIndex]
{
get
{
return (Animal)List(animalIndex);
}
set;
}

3 迭代器
1) 如果要迭代一个类 ,重载方法GetEnumerator() 返回类型是IEnumerator
public class Primes
{
public IEnumerator GetEnumerator();
}

Primes pm = new Primes();
foreach(long i int pm) //可以对这个对象pm用foreach语法

2) 如果要迭代一个类成员,例如一个方法,则使方法返回一个IEnumerable
public static IEnumerable SimpleList()
{
yield return "string1";
yield return "string2";
}

foreach(string item in SimpleList()); //注意这里的 in SimpleList() 语法,可以in一个函数调用

在迭代器中,使用yield 关键字选择要在foreach循环中使用的值 。
应该可以理解为,当执行到 yield return value;时,迭代函数中断执行,当foreach循环获取下一个元素时,迭代函数
从上次断点恢复执行
4 比较接口
类实现IComparable ,实现 CompareTo,可以在集合中用Sort比较 .
IComparer 可以比较两个类,类似C++里的 (函数类)的用法
Comparer是默认实现,可以比较基本类型或实现了IComparable的对象
八 boxing unboxing
把值类型的数据封装成 System.Object,用来例如:可以存储到ArrayList里
MyStruct valTypel = new MyStruct();
object refType = valTypel; //注意这里把valTypel复制了一份 ,也就是说refTypel指向的是另一个副本,也好理解
不然局部变值变量,valTypel 超出作用域释放掉,refTypel也就无效了。
九 检查继承关系,是否可以类型转换使用 is 关键字
if(Chicken is Animal)

as 关键字用于 类型转化检查 类似C++里的 dynamic_cast ,不能转换就返回空值
null
Cow myCow = MyAnimal as Cow;

十 泛型
1 可空类型,看的头晕 int? ?? ,后面再补充这部分笔记吧
2 支持模板

3 Dictionary<K,V> 定义字典map
KeyValuePair<K,V> 创建键值对
4 定义模板 类型 T ,T可能是值类型(struct)或 引用类型,对T进行初始化时用default关键字,会自动赋值。
T payload = default(T)
;
5 使用where约束 T的类型 class MyClass<T1,T2> where T1: Animals where T2: xxx
6 协变与抗变
协变 泛型类 具有 模板参数的继承属性,可以类型向上转换 。用out 关键字
需要 IEnumerable<Animal> 用 IEnumerable<Cow> 就可以代替
抗变是继承属性的向下转换 用in 关键字
需要 IComparer<Cow> 用 IComparer<Animal> 就可以代替
十一 C#的改进 (先简单看一下有什么东东,后续补上)
1 类初始化器,集合初始化
2 类型推理 匿名类型
3 可选参数,类似Object-C的多参数
4 扩展方法,和Object-C的 范畴 类似
5 (o)=>{ o.},回调的内联方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: