一、预处理符号与条件编译
a) 可以使用#define指令来定义一些指导预处理器修改源代码的符号,这是由#if、#elif、#else、#endif指令来完成的
#define MACRO1
using System;
public class Program {
public static void
#if (MACRO1)
Console.WriteLine("MACRO1 is defined.");
#elif (MACRO2)
Console.WriteLine("MACRO2 is defined and MACRO1 is not defined.");
#else
Console.WriteLine("MACRO2 and MACRO1 are both not defined.");
#endif
}
}
b) 可以使用#undef指令将前面符号的定义解除。
c) 预处理符号与条件attribute,ConditionalAttribute可以让一个方法基于符号常量的值来定义。
#define __TRACE__
class Program {
[System.Diagnostics.Conditional("__TRACE__")]
public static void Trace(string s) {
System.Console.WriteLine(s);
}
static void
Trace("Hello");
System.Console.WriteLine("Bye");
}
}
//如果没有定义_trace_符号,将显示BYE,如果定义了_trace_符号,将显示hello,bye
d) #error指令和#warning指令。
#error指令将引发一个自定义的编译错误,通常用于防止编译期间符号定义出现冲突。
#define MACRO1
#define MACRO1
#define MACRO2
#if MACRO1 && MACRO2
#error MACRO1 and MACRO2 cannot be defined at the same time
#endif
public class Program {
public static void
#if (MACRO1)
Console.WriteLine("MACRO1 is defined.");
#elif (MACRO2)
Console.WriteLine("MACRO2 is defined and MACRO1 is not defined.");
#else
Console.WriteLine("MACRO2 and MACRO1 are both not defined.");
#endif
}
}
e) #paragma warning disable指令和#paragma warning restore指令。可以暂时关闭C#编译器产生的某些特定的警告信息。
f) #line指令,用来改变编译错误或警告消息来源的行号。
class Program {
public static void
#line 1 "Method Main()"
int i == 0; // <- ERROR : Not allowed to use the operator 鈥?=鈥?
// in this context!
}
}
以上的代码提示错误在第一行
g) #region指令和#endregion指令
用鼠标一点就能收起或展开某个特定的代码段。
二、 别名机制
a) 用using关键字可以为命名空间或类型定义别名。
using C = System.Console;
class Program{
static void
C.WriteLine("Hello 1");
}
}
b) 全局限定符
C#2.0引入了全局限定符的概念,当出现在命名空间别名限定符之前时,表示通知编译器要的是一个命名空间的名字。
using System;
class Program{
class System { }
const int Console = 691;
static void
global::System.Console.WriteLine("Hello 1");
global::System.Console.WriteLine("Hello 2");
}
}
c) 外部别名:外部别名允许使用分别定义在两个不同程序集中,但类型名称和命名空间都一样的两个类型。如果我们不得不使用同一个程序集的两个不同版本,这种情况就可能发生。见下面的例子:
1、 在引入程序集时引用窗口设置Asm1.dll的别名为AliasAsm1
2、 在引入程序集时引用窗口设置Asm2.dll的别名为AliasAsm2
3、 代码中设置extern alias AliasAsm1及extern alias AliasAsm2;
具体如下:
extern alias AliasAsm1;
extern alias AliasAsm2;
class Program{
static void
AliasAsm1::FooIO.Stream stream1 = new AliasAsm1::FooIO.Stream();
AliasAsm2::FooIO.Stream stream2 = new AliasAsm2::FooIO.Stream();
}
}
三、注释和自动文档
a) 注释:用//和///来做程序的注释,而/*…*/用于暂时屏蔽代码
b) C#有一个选项可以从源代码的///注释中生成注释
c) 使用Ndoc2005将XML文档生成HTML文档
四、标识符
标识符是语法元素的名字,如命名空间名、方法名、类名等。实际上源代码所有能起名字的东西都以标识符为名,标识符的规则:
a) 第一个字符必须是字母、下划线“_”或“@”符号,第一个字符不能是数字
b) 其他字符除了与第一个字符的要求相同(除了不能是@),此外还可以是数字
c) 长度小等于255个字符
d) 标识符不能是C#的关键字
五、命名约定。
a) PascalCase,即标识符中每个单词的首字母使用大写字母,其他字母使用小写
b) 推荐私有实例成员名采用“m_”前缀,私有静态成员名采用“S_”前缀,而接口名则以大写字母“I”开头
六、控制结构;
a) C#与C++的控制结构几乎没有差别,switch语句的用法有一点改变,此外增加了新的循环语句foreach用于遍历数组元素
b) Switch语句,除了switch和case,还有break和default关键字。
Break关键字:执行到break语句时,会直接跳转到switch语句的结尾。注意,如果switch语句的任何一个分支内至少有一条语句,那么该语句就必须以break、goto、或return结尾。
Default关键字:如果表达式的值无法与任何case语句匹配成功,就会执行default语句之后的代码块。注意default语句块不必放在最后
class Program {
static void
int i = 6;
switch (i){
case 1:
System.Console.WriteLine("i equals 1");
break;
case 6:
System.Console.WriteLine("i equals 6");
break;
default:
System.Console.WriteLine("i is not equals to 1 or 6");
break;
}
}
}
可用于Switch语句的类型:
c) 循环语句(do、while、for、foreach)
Break和Continue语句:
可以用continue语句跳过当前循环剩下的部分,达到下一轮循环
可用break语句跳至循环结束。这条语句也是用在switch语句中终止一个语句块的执行,当出现嵌套循环时,这两个语句块的作用范围是最近一层循环。
class Program {
static void
for (int i = 0; i < 10; i++){
System.Console.Write(i);
if (i == 2) continue;//当i=2时,跳过当前循环剩下部分,以下语句不执行
System.Console.Write("C");
if (i == 3) break;//当i=3时,跳至循环结尾。
System.Console.Write("B");
}
}
}
以上语句的输出结果是:0CB 1CB 2
d) Break语句还可以用来终止一个所谓的无限循环。无限循环总是条件为真时的for、do/while或while循环。
While(true)
{}
e) Goto语句
class Program {
static void
int i = 0;
goto label2;
label1:
i++;
goto label3;
label2:
i--;
goto label1;
label3:
System.Console.WriteLine(i);
}
}
f) Main()方法,与C/C++类似,C#可执行程序的入口函数叫Main();
1、 但C#中的main函数必须是静态方法,可以改变visual studio项目属性Application选项卡的startup object设置启动对象。
2、 Main()方法签名式必须遵循以下规则:必须返回void或int类型;接受一个可选的字符串数组类型,这个字符串数组包含应用程序的命令行参数。
第一个元素表示第一个参数,第二个元素表示第二个参数。
3、 通过项目属性-调试-命令行参数可以传入参数到main函数中;
4、 从命令行传入的消息(同时还有环境变量)可以通过sytem.environment类的string[] GetCommandLineArgs()和IDictionary GetEnvironmentVariables()方法获取。
class Program {
static void
if (args.Length == 0)
System.Console.WriteLine("You didn鈥檛type any number to add.");
else{
long result = 0;
foreach (string s in args)
result += System.Int64.Parse(s);
System.Console.WriteLine("Sum :{0}", result);
}
}
}