1、控制台成员:
   (1)Console.WriteLine()与Console.Write()前面要换行。
   (2)Console.ReadLine()与Console.Read()前面读一行返回String类型,后面读一个字符返回int类型。
   (3)ConsoleKeyInfo cki=Console.ReadKey()两种参数一个是无参,一个是bool类型。不用按回车直接输出。参数是true时不输出。
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetPassword(4));
            Console.ReadLine();

        }
        static string GetPassword(int len)
        {
            string Password = "";
            for (int i = 0; i < len; i++)
            {
                ConsoleKeyInfo ski = Console.ReadKey(true);
                Console.Write("*");
                Password = Password + ski.KeyChar;
            }
            return Password;
        }
    }
    (4)namespace可以嵌套,class可以嵌套,方法不可以嵌套。
    (5)控制台小钢琴

 class Program
    {
        static void Main(string[] args)
        {

            while (true)
            {

                bool mark = true;
                ConsoleKeyInfo cki = Console.ReadKey(true);

                switch (cki.KeyChar)
                {
                    case '1':

                        Console.Beep(1000, 500); break;
                    case '2':

                        Console.Beep(1200, 500); break;
                    case '3':

                        Console.Beep(1500, 500); break;
                    case '4':

                        Console.Beep(1500, 500); break;
                    case '5':

                        Console.Beep(1800, 500); break;
                    case '6':

                        Console.Beep(2000, 500); break;
                    case '7':

                        Console.Beep(2500, 500); break;
                    default:
                        Console.WriteLine("请输入1-7");
                        mark = false;
                        break;
                }
                if (mark)
                {
                    Console.BackgroundColor = (ConsoleColor)int.Parse(cki.KeyChar.ToString());

                    for (int i = 0; i < int.Parse(cki.KeyChar.ToString()); i++)
                    {
                        Console.Write("   ");
                    }

                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.WriteLine(cki.KeyChar);
                }
            }


        }
    }
2、数据类型:
   (1)静态的成员是属于类的,非静态的是属于对象的。
   (2)const 定义常量,属于静态的,ReadOnly 定义的只读属于非静态的,且可在构造函数中可以改变。
3、命名规则:
    (1)不能用汉语命名。可以用拼音。匈牙利命名法:属性+类型+对象
   (2)帕斯卡命名法,首字母大写。
4、值类型引用类型:
   (1)值类型隐式的派生自System.ValueType.
5、var与匿名类型:
   var可以在方法内部声明具有隐式类型的变量。但只可以在方法中用。
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中
而无需首先显式定义一个类型,类型名由类型名由编译器生成,并且不能在源代码级使用。这些属性的类型由编译器推断。
var v = new { Amount = 108, Message = "Hello" };
在将匿名类型分配给变量时,必须使用 var 构造初始化该变量。这是因为只有编译器能够访问匿名类型的基础名称。
6、装箱是把值类型转为引用类型,而拆箱是把引用类型转为值类型,装箱拆箱前后配对。
7、类型转换:
  (1)Parse,
      类型.Parse(string)。
   例:int i= int.Parse("123");注意Parse只能把string类型转为其它类型。
  (2)Convert.To类型
      强类型转换。
   例:int i=Covert.ToInt32("123");


值类型与引用类型的一些简单的小知识
 
    C#中分为两种类型,即值类型与引用类型,值类型包括简单类型,
枚举类型,结构类型。而引用类型则分为类类型、接口、数组、委托、字符串string,
有一点要记住string类型是引用类型。
    值类型与引用类型在用时有很大的区别,比如:
 例 1:
   class Program
    {
        static void Main(string[] args)                        

      {
            int a = 5;
            int b = a;
            b = 10;
            Console.WriteLine(a);
            Console.ReadLine();
        }
    }


运行结果是5。
    而如果是引用类型:
 例 2:
   class Program
    {
        static void Main(string[] args)
        {
(1)……   int[] Array_1 = new int[] { 1,2};
(2)……   int[] Array_2 = Array_1;
(3)……   Array_2[0] = 10;
(4)……   Console.WriteLine(Array_1[0]);
            Console.ReadLine();
        }
    }


运行结果却变成了10。

   这是为什么呢?因为值类型是存放在线程堆栈中
例1中执行Main函数时,首先在堆栈中把a=5放入,执行b=a时是把a的值给了b。
当执行b=10时,在堆栈中放入b=10,而a的值未变。输出a时,a还是等于5。
   而当对象变为数组时就不一样了,因为数组在线程堆栈中存放的只是地址,
当执行例2中的(1)时,等号左边会把Array_1[]数组存放在线程堆栈中,等号右边
当遇见new时,会在托管堆中开出一块内存把1,2放入,然后把地址传给线程堆栈中的
Arrary_1。当执行到(2)时,Array_1会把地址给Array_2,也就是两个数组同时指向
{1,2},当到(3)时会把托管堆中的1换为2。现在Array_1和Array_2都指向{10,2}。
当输出Array_1[0]时值就变成了10。这就是值类型与引用类型的差别。