[C#] Private Notebook of C#

摘要:[C#] Private Notebook of C#


内容转自 http://forums.wasabistudio.ca/viewtopic.php?f=172&t=22681

Code Region

  • 方便user在VS中展开及收合程序区域。



#region "程序区域注解"

//程序区域..

#ednregion

回到页顶

Namespace

  • 用来管理class。


  • 默认为项目名称。



namespace 命名空间名称
{
    //定义类..
}

回到页顶

Inheritance

  • 和Java一样,只能声明继承一个父类。


  • 继承语法和C++一样。



[存取修饰子] class 类名称 : 父类名称
{
    //定义类成员..
}

回到页顶

Property

  • 一般属性名称会和对应的字段名称相同,但第一个字母大写。


  • 属性默认的存取修饰子为public。


范例(1)


class Test
{
    private int a1;

    public int A1
    {
        get { return this.a1; }
        set { this.a1 = value; }
    }

    public int a2;

    private int A2
    {
        get { return this.a2; }
        set { this.a2 = value; }
    }
}

  • value是一个关键字,推测的运行原理:
    get:int A1 = this.a1; 外部 = A1;
    set:int A1 = var value; a1 = A1;

  • get{}和set{}都不能重复。


  • 属性的数据类型可以任意声明,不过必须可以安全的get和set而不发生溢位,
    所以原则上会和对应的字段用相同的数据类型。


  • 字段可以声明为public,外部程序可以直接存取该字段值(不过这样不符合数据封装的概念);
    属性也可以声明为private,只有类内的成员可以存取该属性值(不过这样没啥意义)。



范例(2)


class Test
{
    static private int a1;

    static public int A1
    {
        get { return a1; }
        set { a1 = value; }
    }

    static private int a2;

    public int A2
    {
        get { return a2; }
        set { a2 = value; }
    }

    private int a3;

    static public int A3
    {
        get { return new Test().a3; }
        set { new Test().a3 = value; }
    }
}

  • 如果字段声明为static,对应的属性最好也声明为static,并直接以类名称存取:Test.A1。


  • 如果字段和对应的属性一个为static一个不是,那会变得很无言,
    字段为static但属性不是:外部存取属性时需先new Test对象,new Test().A2
    属性为static但字段不是:需在get{}和set{}内new Test对象。


  • 静态成员(field或method)均不能以this存取,this代表的是以该类new出来的instance。





回到页顶

Constructor

  • 声明constructor时,可以用this调用另一个constructor,或用base调用父类的constructor。


范例


class Test
{
    private int a, b, c;

    public Test(int a, int b, int c) : base()
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public Test() : this(0, 0, 0) { }
}

class Test2 : Test
{
    private int x, y, z;

    public Test2(int x, int y, int z) : base(x, y, z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public Test2() : this(0, 0, 0) {}
}

  • base()不能使用this当参数,因为这个时候this的instance还没new出来。





回到页顶

Access Modifiers

  • private
    只能在自己类中存取。


  • protected
    只能在自己类与子类中存取。


  • internal
    只能在自己类与项目(组件)中其他的类存取。


  • protected internal
    只能在自己类、子类与项目(组件)中其他的类存取。


  • pulbic
    没有任何存取限制。



回到页顶

Nullable Variables

  • 声明:

    
    数据类型? 变量名称;


  • 指定:

    
    变量A = 可为Null的变量B ?? 当变量B为Null的替代值;



回到页顶

Implicitly Typed Local Variables


var 变量名称 = 值;


var 变量名称 = new [] {成员0, 成员1, 成员3, ...};


foreach (var 变量名称 in 数组/集合变量) { ... }


var 变量名称 = new { 属性名称1 = 值1, 属性名称2 = 值2, ...};


回到页顶

Enumeration


enum 枚举常数名称 [: 整数类型(默认为int)]
{
    常数1 [=值(默认从0依序开始)];
    常数2 [=值];
    ...
}


枚举常数名称 变量名称 = 枚举常数名称.常数n


回到页顶

Comparison Operator

  • C#的 String == String 并不像Java一样用来判断两个参照是否指向同一个物,
    而是判别两个字符串的内容是否相同,与Java的String.equal()功能一样。



回到页顶

Switch

  • 和Java不同,case的值可以为String,比较方式和String==String一样,不过不建议case String。


  • 和Java不同,每个case包括default都需要break或goto,continue则不能用在switch之中。



switch (变量或运算式)
{
    case 值1:
        [叙述...]
        break/goto case 值n;
    case 值2:
        [叙述...]
        break/goto case 值n;
    case 值3:
        [叙述...]
        break/goto case 值n;
    ...
    default:
        [叙述...]
        break/goto case 值n;
}

回到页顶

Foreach


foreach (数据类型 变量 in 集合或数组)
{
    //叙述...
}

回到页顶

Arrays

  • C#的数组只能这样声明:int[] array = new int[100];
    不能像Java或C声明成:int array[] = new int[100];


  • 数组可透过Length属性取得长度(Java是小写)。


多维数组(1)

  • 多维数组第一种声明方式(矩阵):

    
    int[,] ar1 = new int[3, 5];
    int[,] ar2 = { { 1, 2, 3, 4, 5 },
                   { 1, 2, 3, 4, 5 },
                   { 1, 2, 3, 4, 5 }
                 };
    int[,,] ar3 = new int[3, 5, 2];
    int[,,] ar4 = { { { 1, 2 },
                      { 1, 2 },
                      { 1, 2 },
                      { 1, 2 },
                      { 1, 2 }
                    },
                    { { 1, 2 },
                      { 1, 2 },
                      { 1, 2 },
                      { 1, 2 },
                      { 1, 2 }
                    },
                    { { 1, 2 },
                      { 1, 2 },
                      { 1, 2 },
                      { 1, 2 },
                      { 1, 2 }
                    }
                 };


  • 不过这种声明方式只能取得数组总长度(ex: ar1.Length),无法取得各成员数组的长度。


  • 此外若用foreacn循环探访这种声明方式的数组(ex: foreach (int temp in ar1)),
    会从头到尾探访每个成员,没办法各别探访某个成员数组。



多维数组(2)

  • 多维数组第二种声明方式,和Java差不多,但不能直接在声明时配置(ex: int[][] ar = new int[3][5]):

    
    /* 声明不规则多为数组 */
    int[][] ar = new int[3][];
    
    /* 配置成员数组 */
    for (int i = 0; i < ar.Length; i++)
        ar1[i] = new int[(i+1)*10];
    
    /* 取得数组及成员数组的长度 */
    Console.WriteLine("{0}", ar.Length);
    Console.WriteLine("{0}", ar[0].Length);
    Console.WriteLine("{0}", ar[1].Length);
    Console.WriteLine("{0}", ar[2].Length);
    
    /* 设定成员数组 */
    for (int i = 0; i < ar.Length; i++)
    {
        for (int j = 0; j < ar[i].Length; j++)
            ar[i][j] = j+1;
    }
    
    /* 循环走访数组 */
    foreach (int[] TEMP in ar)
    {
        foreach (int temp in TEMP)
        {
            Console.WriteLine("{0}", temp);
        }
    }



两种方式混搭著用


/* 声明 */
int[][,] ar1 = new int[3][,];
int[,][] ar2 = new int[3, 5][];

/* 配置 */
for (int i=0; i



回到页顶

Partical Class

  • 让user将一个类写在不同原始档中,编译时会合并成一个类档。



[存取修饰子] partial class 类名称 [: 父类名称]
{
    //定义类成员..
}
[存取修饰子] partial class 类名称 [: 父类名称]
{
    //定义类成员..
}