unity开发 --------- c# 基本语法 002

关联内容:

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函数了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值