C#笔记

var 可以使编译器自动确定一个合适的类型
例如 var x = 10; 则在编译时自动将x变量设为INT型。


如下函数
void optMethod(int first, double second = 0.0, string third = "Hello")
可以用此方法调用optMethod(first : 99, second : 123.45, third : "World");


格式化字符串举例
Console.WriteLine("Fee is {0}", fee);


如果要使用强制类型转换,使用如下的方式  A a = (A) b; 将可能导致抛出异常(如果无法转换),而如果使用as语句,则转换失败不会抛出异常,只赋值为Null,例如 A a = b as A;


每个群成员的访问属性都需要单独指定,否则便是默认的private。


每个C#程序需要一个Main函数,可以放在任何类中,如果两个类同时定义了Main函数,当然,会出错。要解决错误,需要修改编译选项,指定用某个类的Main函数。


Main函数接受的字符串数组参数中,第一个元素不包含应用程序的名称。


new创建的对象并不一定都在堆上(只有引用类型),如果是数值类型,则是在栈上。


引用类型必须使用new实例化。Myclass myClass;这句话只是一个声明,myClass并没有真正被实例化,必须使用Myclass myClass = new MyClass();


继承的声明 class B : A


在构造函数中调用另一个构造函数,可以使用this(...)的格式。要调用基类的构造函数,需要使用base(...)。


构造函数初始化表只能访问构造函数,而不能初始化成员。


readonly修饰的成员变量只能在构造函数中初始化


静态构造函数用来初始化静态只读成员变量。


internal修饰的访问权限是只在同一程序集内部可见。即同一DLL中。不可跨DLL访问。


使用sealed限定符修饰的类将不可以被作为基类使用。


ref与out关键字实现了C++中的引用,即void GetValue(ref int Val)、void GetValue(out int Val)与C++中的void GetValue(int& Val)等效,但需注意的是,ref所修饰的变量必须在调用函数之前初始化。另外,在调用函数时,也必须显式指出ref和out关键字,例如GetValue(ref K)和GetValue(out K)。


可变数目的方法参数函数声明为void Sum(params int[] p),这样便可以动态传入不同个数的int参数了。例如Sum(i, j, k)。


如果要在子类中覆盖父类的函数,需要在子类的函数声明前加new修饰符。否则编译器会警告。


要重载父类的虚函数,需要使用override修饰符修饰子类的函数,如果使用new而不使用override修饰子类的实现函数,则子类的函数将是实现覆盖的效果,而非重载。


C#中的特性为“属性”。它能很好地替代C++的类中对同一个变量的get与set方法,从而实现良好地封装性。


只编写属性的get方法即可把属性变为只读的。


要使用锯齿状数组,可以使用类似又下语法。int[][] ints; ints = new int[2][]; ints[0] = new int[3];


特性的使用中,可以使用定位参数+命名参数的形式,其中命名参数是特性的属性,具体解释请参照书籍。


每个特性类可以使用[AttributeUsage(AttributeTargets.All, AllowMultiple=true]类似的声明来修饰。它表示了这个特性的可支持类型及是否是多次特性。


特性可以理解为对类型和成员的注释信息,这种信息可以利用反射机制来进行获取,从而不必借
助向资源文件和常量中堵塞一些琐碎信息。


interface中的声明不能加访问限定符,默认所有的声明都是public的。


要检测某个类是否实现了某个接口,可以使用is表达式。


在实现一个接口时,如果对实现的函数不使用public修饰,则客户只能通过将子类转换为接口类型才能访问。


sizeof操作符只能对值型变量使用。


对引用型变量互相赋值将会导致引用传递,而不是值复制!


switch语句中,不支持“贯行”,即一个case子句执行完后没有break而继续执行下一个case子句,但是支持几个case使用同样的执行代码,即使用连续的case语法而没有各自单独的子句。


foreach (type in expression)


代表(delegate)可以使用加法成为一个被连续调用的新代表,也可以从组合代表中使用减法消去已有的代表。

using语句,定义一个范围,在范围结束时处理对象。
场景:
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。
例如:

using (Class1 cls1 = new Class1(), cls2 = new Class1())
{
// the code using cls1, cls2


}
// call the Dispose on cls1 and cls2


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值