C#基本语法总结

一、类型推断(type inference):var
编译器可以根据变量的初始化推断变量的类型
int someNumber = 0;
var someNumber = 0;
规则:
1、变量必须初始化;
2、初始化器不能为空;
3、初始化器必须放在表达式中;
4、不能把初始化器设置为一个对象,除非在初始人器中创建了一个新对象
声明了变量,推断了类型后,就不能改变变量的类型。若要改变就要遵循强类型转换规则。

二、字段和局部变量的作用域冲突
c#把在类型级别声明的变量看作字段,而把在方法中声明的变量看作局部变量。
要引用类级变量则用语法object.fieldname,
例1:
using System;
 
namespace Wrox
{
    class ScopeTest
    {
        static int j = 100;
        public static void main()
        {
            int i = 30;
            Console.WriteLine(i);    //30
            Console.WriteLine(ScopeTest.j);    //100
        }
    }
}
例2:
string text ;
 for (int index = 0; index < 10; index++ )
 {
        text = "line" + Convert.ToString(index);
        Console.WriteLine("{0}", text);
}
Console.WriteLine("last {0}", text);
上面代码Console.WriteLine("last {0}", text);会出现错误,
要对text进行赋值才能正确执行 
string text = "";      //string text = null;

三、常量
const ing a = 100;
特点有:
常量必须在声明是初始化
常量的值必须能在编译时用于计算,因此不能从一个变量中提取的值来初始化常量
常量总是静态的
由于使用易于读到的名称替代了较难读取的数字或字符串,常量使程序变得更易于阅读
常量使程序更易于修改
常量更容易避免程序出现错误

四、预定义数据类型
1、值类型和引用类型

c#把数据类型分为两种:值类型和引用类型
从概念上讲,值类型直接存储其值,而引用类型存储对值的引用。这两种存储的内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。

(类比C++,这个语法更类似于引用,而不是指针。我们使用.(句点)符号而不是用->来访问对象成员。在语法上,c#引用看起来更类似于C++引用变量。但是抛开表面的语法,实际上它更类似于c++指针。???)

2、CTS类型
c#认可的基本预定义类型并没有内置于c#语言中,而是内置于,NET Framework中。

c#有15个预定义类型其中有13个是值类型,两个是引用类型(object和string)
2.1、整型
在C#中,int总是32位带符号的整数,而在c++中,int是带符号的整数,但其位数取决于平台。c#中所有的数据类型都以平台无关的方式定义,以备将来c#和.NET迁移到其他平台上。
byte是0~255的标准8位类型,(c#认为byte类型和char类型完全不同,它们之间的转换必须显式写出)
2.2、bool类型
c#的bool类型用于包含布尔值true/false。而不是用0表示false,非0是true。
2.3、string类型
2.3.1、string 是一个引用类型,String对象被分配在堆上,而不是栈上。
string s1 = "abc";
string s2  = s1;
s1 = "abccba";
ConsoleWrite(s1);    //abccba
ConsoleWrite(s2);    //123
以上s1改变了而对S2并没有影响,是因为当初始化s1时,就在堆上分配了一个新的sting对象。在初始化s2时引用也指向这个对象。但当s1改变时,并不会替换原来的值,堆上会为新值分配一个新对象。s2扔然指向原来的对象。这实际上是运算符重载的结果。
2.3.2、字符串字面值
"C:\\Temp\\" 等价于 @"C:\Temp\"
2.3.3、其它
string myString = "udbful zzg";
char myChar = myString[0];    //不能用这种方式为各个字符串赋值
char[] myChars = myString.ToCharArray();    //用这个就解决了为各个字符串赋值了
常用函数还有:
ToLower();
TOUpper();
Trim();    //删除指定字符
TrimStart();    TrimEnd();
PadLeft();    PadRight();
Split();
2.4、object 类型
在c#中,object 类型就是最终 父类型,所有内置类型和用户定义的类型都从它派生而来。原因有两:
可以使用object引用绑定任何子类型的对象;
object类型执行许多一般用途的基本方法
 
附:表达式的溢出检查:
checked(expression)
unchecked(expression)
设置方法:
properties->Build->Advanced(高级)->chenk for arithmetic overflow/unflow

五、流控制
1、switch语句
case的值必须是常量表达式,不允许使用变量。
c#的switch... case语句比c++更安全。特别是它禁止几乎所有case中的失败条件,如果激活了块中靠前的一条case子句,后面的case子句主不会被激活,除非使用goto语句。编译器会把没有break 语句的case子句标记为错误。
但用一种情况例外,如果一条case子句为空,就可以从这个case跳到下一条case上。
例:
case 1:
case 2:
case 3:
      a= 1;
      break;
2、foreach循环(以后增加)
foreach (<baseType><name>  in <array>)
{
//can use <name> for each element
}
如:
string friendNames = {"abc", "123", "000"};
foreach(string name in friendNames)
{
    Console.WriteLine(name);
}

六、枚举
enum<typeName>
{
<value>,
}
<typeName> <varName>    //声明新类型变量
<varName>=<typeName>.<value>    //赋值
默认情况是int,也可改成其它类型
enum<typeName> : <underlyingType>
...
创建枚举右以节省大量时间,减少许多麻烦,其优点有:
可以使代码更易于维护
枚举使代码更清晰
枚举也使代码更易于键入
在c#中,枚举的真正强大之处是它们在后邓中佳 实例化为派生于基类的结构。这表示可以对它们调用方法,执行有用的任务。
例:
public enum TimeOfDay
{
    Morning = 0,
    Afternoon = 1,
    Evening = 2
}
获取枚举的字符串表示:
TimeOfDay time = TimeOfDay.Afternoon;
Console.WriteLine(time.ToString());    //Afternoon
从字符串中获取枚举值
TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true);
Console.WriteLine((int)time2);    //

七、数组

1、声明
<baseType>[] <name>;      //int [] array;
<baseType>[, , ] <name>;    //多维
2、初始化
2.1 以字面形式指定数组的完整内容      //int[] array = {1,2,3};    //大小确定了
2.2 先指定大小,再用new初始化所有数组元素    //int[] array = new int[5];
2.3 2.1和2.2的结全使用    //int[] array = new int[5] {1,2,3,4,5};    //大小要写赋值一至大小
3、数组的数组
<baseType>[][] array;    //声明
array = new int[2][];    //初始化方法一
array[0] = new int[3];
array[1] = new int[4];
array = new int[3][] = {new int[] {1,2,3}, new int[] {1}, new int[] {1,2}};    //初始化方法二
int [][] array = {new int[] {1,2,3}, new int[] {1}, new int[] {1,2}};    //初始化方法三

八、参数:
1、参数数组
使用关键字 params可以使用不定参数
static <returnType> <functionName> (<p1Type> <p1Name>, ... , params <type>[] <name>)
如:
 static int SumVals(params int[] vals)
{
            int sum = 0;
            foreach(int val in vals)
            {
                sum += val;
            }
            return sum;
}
调用:sum = SumVals(1, 5, 10, 34);
 
2、引用参数与输出参数:
引用使用关键字ref,输出参数使用关键字out
static void fun(ref int val)
附:传入参数是变量不能为常量,其次必须初始化过的变量。
out 的执行方式与引用完全一样但有以下不同:
1、把未赋值给引用是非法,但可以把未赋初始化的变量用作out参数
2、在函数使用out参数时,out参数必须看作是还未赋值
static void MaxValue(int[] array, out int maxIndex)
{
            int maxValue = array[0];
            maxIndex = 0;
            for (int index = 1; index < array.Length; index++)
            {
                if (array[index] > maxValue)
                {
                    maxValue = array[index];
                    maxIndex = index;
                }
            }
}
调用方式:    MaxValue(array, out maxIndex);


九、名称空间(以后再加)
名称空间提供了一种组织相关类和其他类型的方式。与文件或组件不同,名称空间是一种逻组合,而不是物理组合。

十、控制台I/O
Console.ReadLine();    //读输入
Console.Write();
Console.WriteLine();    //写输出
Console.ReadKey();    //等待键盘
Console.WriteLine("{0} plus {1} equals {2}", i, j, i+j);
Console.WriteLine("{0, 4}\n + {1, 4}\n -------\n {2, 4}", i, j, i+j);
使用占位符来代替这些格式字符串
double d = 0.2345;
Console.WriteLine("{0:#.00}", d);    //.23

十一、c#预处理器指令(以后加增)
1、#define/#undef
2、#if/#elif/#else/#endif
3、#warning/#error
4、#region/#endregion
5、#line
6、#pragma

十二、关于调试
debug->windows下有Watch/Locals/Immediate/Command常用调试方法,好用
对于Command不知道怎么用,只有用>cmd通过Immediate转到Command
用immed则转回Immediate

十三、异常
try...catch...finally
try
{
}
catch (<exception> e)
{
}
finally
{
}
可以只有try finally块,而没有catch。或者有一个try块和好几个catch,如果有一个或多个catch块,则finally块就是可选的,否则就是必需的。
throw

十四、c#编程规则
1、变量命名规则:
变量名的第一个字符必须是字母、下划线、或@
其后的字符可以是字母、下划线或数字
2、命名约定
许多情况下名称都应使用Pascal大小写形式(如:EmployeeSalary)
名称空间、类、基类中的成员等都应遵循这规则,
在c#常量也不用全部都用大小,Pascal方法命名。如:const int MaximumLength;
另一种大小写模式camel大小写形式(如:employeeSalary)
以下三种情况可以使用camel大小写形式
类型中所有私有成员字段的名称都应是camel大小写形式
private int subId;
传递给方法的所有参数的名称都应是camel大小写形式
public void Fun(string salesmanName, int quantity)
camel大小写形式也可以用于区分同名的两个对象----比较常见的情况是属性封装一个字段
private string employeeName;
public string EmployeeName
{
    get
    {
        return employeeName;
    }
}

 
posted on 2012-11-29 23:34  走出地平线  阅读(129)  评论(0)    收藏  举报