CSharp简记

来源:互联网 发布:人员管理 知乎 部门 编辑:程序博客网 时间:2024/04/27 19:59

生成动态链接库的命令:
csc /target:library MyClass.cs

编译时制定要关联的动态链接库:
csc /reference:MyClass.dll NewClass.cs


使用命名空间的好处:
1,同一个命名空间的代码可以分布在多个文件中。
2,命名空间具有可扩展性。
3,可以堆砌出层次式的类组织结构。


命名空间使用别名:
using A=P_namespace.C_namespace;

c#中方法参数的传递机制:
1,值参数
方法名称(参数类型 参数名称 [,参数类型 参数名称])
2,引用参数
方法名称(ref 参数类型 参数名称 [,参数类型 参数名称])
3,输出参数
方法名称(out 参数类型 参数名称 [,参数类型 参数名称])

引用传递和输出传递类似于C++的指针传递,会导致参数值的修改
区别在于:输出参数必须在函数内部对参数初始化,而引用参数则不允许在函数内部对参数初始化

对于引用类型(除了string)无论使用哪种方式都会导致参数值的修改,也就是说上述分类只对基本数据类型有效
对于string类型,尽管它是引用类型,但它是不可变的

可变参数:使用关键字params,且param是后必须紧跟数组类型参数
public int addAll(params int[] valuse)

字符:
c#中的字符使用Unicode编码,每一个字符时System.Char的实例

将数字打印成字符:Console.Write("/x41");             A的16进制编码是41
将数字打印成Unicode字符:Console.Write("/u4F60");    "你"的unicode编码是41
                  Console.Write(char(65));           A的10进制编码是65
                  Convert.ToChar(65);                A的10进制编码是65      转化速度不如上面两种
                 
Console.Write("{0,3}:{1,-3}",a,b);                    0代表a   1代表b   3代表占3个空格   +代表右对齐

string.Format("{0:x},{1:x}",(int)'一',(int)'二');               显示两个字的16进制编码  x表示16进制

Unicode中中文编码的范围是0x4e00~0x9fa5


类:
class A: Object //继承
{
    public A:base() //调用基类的构造函数
    {
    }
}

calss A
{
    int num=100;
    string school="myschool";
    public A(){}
    public A(int i){this.num=i;}
    public A(string s){this.school=s;}
    public A(int i,string s){this.num=1;this.school=s;}
}
这样的代码通过 IL DASM查看后会发现 在每一个构造函数的开头都会重复出现对num,school赋值的情况
也即对变量直接赋值num=100会是代码出现大量的冗余。所以直接不赋值,或对代码进行修改:
calss A
{
    int num;
    string school;
    public A(){num=100;school="myschool";}
    public A(int i):this(){this.num=i;}         //调用默认构造器
    public A(string s):this(){this.school=s;}
    public A(int i,string s):this(){this.num=1;this.school=s;}
}//其实很少人会写出这样的代码,只是稍微提醒一下而已

class B:A
{}
//B类默认会调用A的无参构造器
//当类没有构造器时,会自动为其生成一个无参数构造器
//可以用IL DASM来查看

public B(int i):base(i)  //使用base类似于Java中的super
{}

类的静态构造器一般用于类的静态成员的初始化。静态构造器只执行一次。
静态构造器无参数,无访问修饰符,不能被调用。在类加载时类的静态构造器自动调用。
具体查看例子。


一个类只有一个析构函数。
析构函数不能被继承或重载。
析构函数不能加访问修饰符。
析构函数自动被调用。
class A
{
     ~A()
     {
     }
}
使用析构函数会导致程序性能的下降

释放模式:
需要释放资(非托管资源)源场景:
文件
网络连接
嵌套字
互斥体
…………
用接口来dispose   IDisposable
interface IDisposable
{
void Dispose();
}
用接口来释放资源可以避免因使用析构函数而导致的性能的下降
dispose方法会阻止finalize方法的自动调用

对需要释放资源的调用,一般采用如下方式:
MyResource mr=new MyResource();
try
{
    mr.doSomething();
}finally
{
    mr.dispose();
}
当实现IDisposable接口后,try~finally代码块可简写成如下形式
using(MyResource mr=new MyResource())
{
mr.doSomething();
}
通过IL查看可以知道,using其实也生成了try~finally代码块并在finally中调用了dispose方法


访问修饰符:
sealed 不能被继承的类
partial 可以声明在不同文件中的同一个类

强制类型转换:
int a=1000;
long b=2000000;
try
{
a=checked(int(b)); 
}
check  uncheck可以用来检查或者不检查类型转换时可能发出的了溢出
checked{}   对多条语句进行检查

Type代表一个类的类型
判断某个对象是否是某个类的实例用is  使用方法和Java中的isInstanceOf有形同的使用方法
as简化了is的if判定 并简化类型转换