关联内容:
c#基本语法 http://blog.csdn.net/u012085988/article/details/19981161
1、class与struct
在c#中结构与类的区别在于他们在内存上的存储方式,访问方式(class是存储在堆上的引用类型,struct是存储在栈上的值类型)和他们的的一些特性(如struct不支持继承)。对于较小的数据类型使用struct能提高性能。在语法上,struct与class非常相似。他们都是用new来声明实例!
2、传参 : 直接传参,ref传参,out传参
同c++一样,c#默认的传参方式是传值(注意,对于引用类型,实际传递的是引用的一个拷贝,而并非是引用所指对象的拷贝);若想像c++中的“&”一样传递参数,就要用到关键字ref, ref表示的意义与引用符号“&”一样,但语法上有所不同:“&”只需在定义函数时显示地标注,而ref不仅在定义时要显示滴给出,在调用时也要显示滴标注。如:
public void test(ref int i)
{
// ...
}
public void func()
{
int i = 8;
test(ref i);
}
前面说过,c#中变量未初始化,就会被视为只声明,没有实际定义的变量!这时,如果将该变量当做右值使用,编译器就会报错!而关键字out打破了这一规则!它可以使用没有初始化过的变量!!!代码如下:
public void test(out int i)
{
i = 111;
}
public void func()
{
int a;
test(out a);
}
如果不用关键字out,这段代码是无法通过编译的。
3、缺省参数。与c++一致
4、命名参数。使用命名参数,可以不按参数定义的顺利来带入参数。
public void test(string first, string second)
{
// .....
}
// 调用函数
test(second:"haha", first: "hehe");
5、属性
c++中并没有这个概念,实际上他就是一个字段,然后用get、set来设定访问权限。
private int age;
public int Age
{
get
{
return age;
}
private set
{
age = value;
}
}
需要注意的是,get和set必须有一个是public的,否则,就会产生一个编译错误。
若我们像下面这样写,则系统会自动为我们实现属性。
private int Age{get; private set}
6、inline
c#中并没有inline这个关键字,言外之意就是我们在C#中不能显示滴控制某个函数是否是inline的。相反,编译器会自动为我们完成inline优化!像属性这种简单的操作,编译器就会自动帮我们优化为inline。
7、静态构造函数
静态构造函数没有权限修饰符(public、private。。。)。如:
static Name()
{
}
它最大的特点就是只调用一次!但何时调就不知道了。
8、构造函数初始化器
构造函数初始化器就是从构造函数中调用其他构造函数
class Car
{
public Car(string arg1, uint arg2)
{
//....
}
public Car(string arg) : this(arg, 4)
{
}
}
当然,还能调用基类中的构造函数,调用基类构造函数,只需将this改为base
这点与c++11中的代理构造函数相似。
9、只读字段 readonly
readonly为不变量,即一旦初始化后就不会被修改的量,所以c#称之为只读变量。它的使用与其他字段相同,但只能在构造函数中赋值!
10、匿名类型
var test1 = new { FirstName = "fn", LastName = "ln"}
var test2 = new { FirstName = "ffn", LastName = "lln"}
则test1和test2的类型相同,可以使用test1 = test2进行赋值。
若某个类有FirstName和LastName这两个字段,还可以向下面这样定义
var test new{obj.FirstName, obj.LastName};
这样就会自动将obj中的FirstName和LastName两个字段映射到匿名类中。
11、struct
使用struct要注意一下内容
①不支持继承
②编译器总是会提供一个默认构造函数。它是不允许替代的。
③可以指定字段在内存中的布局
struct对象调用new时,并不是在堆上分配内存,而是调用相应的构造函数。对于struct,不调用new也是可行的。如:
struct Test {};
Test t = new Test();
// 或者直接
Test t;
t.x = ... // 这里编译器并不会把他当成未初始化的变量,对于struct,这种语法是合法的,但对于class,就会报错
12、 partial 部分类
c#允许使用partial将class,struct和接口分开写到不同的文件
13、静态类
14、扩展方法
有许多扩展类的方法。如果有源码,可以用继承。但如果没有源码怎么办?c#提供了一种方法,叫扩展方法。
扩展方法是静态的,它的关键部分就是在定义方法时,第一个参数要是如下格式
this className name;
如:
public static class Test
{
public static void add001(this Money money, decimal amount)
{
money.Amount += amount;
}
}
方法add001就是类Money的拓展方法!此后就可以像其他成员函数一样,调用add001函数了。