C#流控制

流控制:
选择:1.if语句 2.switch语句
循环:3.for语句 ,4.while语句,5.do-while(先做后判),6.foreach语句
跳转语句:7.goto语句,8.break语句,9.continue语句,10.return语句,11.using语句

1.if语句 (通过范围判断)

if(condition) 

         statement(s)

else

              statement(s)

 

2.swith语句(通过具体值判断)

int number=2;

switch(number)   //number是具体的值

{

         case “1”;    //”1”是number可能的值

                   Console.WriteLine(“1”);

                   break;  //跳出

              case “2”

                   Console.WriteLine(“2”);

                   break; 

         default;

                   Console.WriteLine(“不是1,也不是2”);

                   break; 

}

 

3.循环 for语句 

for(condition1,condition2,condition3)

{           //可以嵌套循环

     statement(s)

}

for(int Age=0;Age<100;Age++)

    {

       Console.WriteLine("我{0}岁",Age);//从我0岁,输到我99岁

     }

 

4.循环while语句(是先判后做,用于非定长循环,即不知道它要循环多少次)

while(condition)  //直到condition为假,循环停止,

{

      statement(s)

}

 

5.循环do-while语句 (先做后判)

do

{

         statement(s)

}while(condition)  //直到condition为假,循环停止;至少循环一次

 

6.循环foreach  (用于数组,将数组中的数依次输出)

int [] Array={1,2,3};   //一维

         foreach( int temp inArray)

         {

                   Console.WriteLine(temp);//1,2,3分三行输出

}

扩充:

int[,] Array2D=new int[3,2] {{9,99},{3,33},{5,55}};//二维

foreach(int temp in Array2D)

{

              Console.WriteLine(temp); //分别输出9,99,3,33,5,55共6行

}

 

7.跳转goto语句

作用:直接跳转到程序中用标签指定的别一行(标签是一个标识符,后跟一个冒号)

 goto Label1;  //注,这是分号,不要写成冒号

              Console.WriteLine("我要去找Label1");  //这句跳过,不输出

    Label1:

          Console.WriteLine("我就是Label1");  //只输出”我就是Lable1”

 

8.跳转 break语句

作用:一般用于switch-case语句,也可以用于退出for,foreach,while或do…while循环。用于跳出整个循环,然后进行循环后面的语句。

 

9.跳转 continue语句

作用:类似break,也必须用于for/foreach/while/do…while循环中。与break的区别,它不是退出整个循环,只是从循环的当前迭代中跳出,然后进行下一次的迭代。

 

10.跳转return语句

作用:用于退出类的方法。return 语句终止它出现在其中的方法的执行并将控制返回给调用方法。它还可以返回一个可选值。如果方法为 void 类型,则可以省略 return 语句。

如果 return 语句位于 try 块中,则将在控制流返回到调用方法之前执行 finally 块(如果存在)。

 

11.跳转 using语句确保在使用完资源密集型对象后,就处理它们。

using 关键字有两个主要用途:

·      作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。请参见 using 指令

·      作为语句,用于定义一个范围,在此范围的末尾将释放对象。请参见 using 语句

语法:

using(object)

{

         //code using object

}

 

C#作为一种现代的面向对象编程语言,提供了多种机制来实现**控制流防护(Control Flow Integrity, CFI)**,以防止恶意攻击者通过修改程序的执行流来破坏程序或执行恶意代码。控制流防护的核心目标是确保程序的执行路径始终符合预期,尤其是在面对缓冲区溢出、代码注入等常见攻击手段时。 ### 1. 异常处理机制 C#通过结构化的异常处理机制(try-catch-finally)来增强控制流的安全性。这种机制确保即使在程序执行过程中发生异常,也能进行适当的清理和恢复操作,从而避免程序因异常而进入不可控状态。 ```csharp try { // 可能引发异常的代码 } catch (Exception ex) { // 捕获并处理异常 Console.WriteLine("发生异常:" + ex.Message); } finally { // 无论是否发生异常,都会执行的清理代码 } ``` 这种结构化的异常处理机制有助于防止因未处理异常而导致的控制流偏离[^3]。 ### 2. 安全编译选项与.NET运行时保护 C#代码在编译为IL(Intermediate Language)后,由.NET运行时(CLR)执行。CLR提供了诸如**验证机制(Verification)**和**即时编译时的类型安全检查**等功能,确保代码在执行前符合类型安全和控制流完整性要求。例如,使用`/platform:anycpu32bitpreferred`等编译选项可以控制程序在不同平台上的行为,防止因平台差异导致的控制流异常。 此外,.NET运行时支持**AppDomain**机制,可以将不同组件隔离运行,限制其访问权限,从而保护整体控制流不被恶意代码破坏。 ### 3. 使用安全的委托与事件机制 C#中的委托(Delegate)和事件(Event)机制在实现回调函数和事件驱动架构时,也提供了类型安全的保障。CLR确保只有兼容的函数签名可以被绑定到委托,从而防止非法跳转。 ```csharp public delegate void MyEventHandler(string message); public class EventPublisher { public event MyEventHandler OnSomethingHappened; public void DoSomething() { OnSomethingHappened?.Invoke("Something happened!"); } } ``` 这种机制通过类型检查和访问控制,防止非法的控制流转移[^1]。 ### 4. 使用安全库与避免不安全代码 C#默认支持安全代码编写,但在某些场景下允许使用`unsafe`代码块和指针操作。虽然这提供了更高的性能和灵活性,但也增加了控制流被篡改的风险。因此,在必须使用`unsafe`代码时,应严格遵循安全编码规范,并启用`/unsafe`编译选项进行明确标识。 ```csharp unsafe { int* ptr = &value; *ptr = 100; } ``` 为增强控制流安全性,建议尽可能使用安全库(如`SafeHandle`)来替代原始指针操作[^4]。 ### 5. 控制流完整性(CFI)扩展支持 虽然C#本身不直接提供CFI机制,但可以通过与底层操作系统和编译器协作来实现。例如,Windows平台上的**Control Flow Guard(CFG)**技术可以与C#项目配合使用,防止间接跳转到非法地址。该技术通过编译器插入检查逻辑,在运行时验证间接调用的目标地址是否合法。 启用Control Flow Guard的编译选项如下: ```bash cl /guard:cf myapp.cpp ``` 虽然CFG主要针对C/C++代码,但C#项目若与原生代码交互,也可以从中受益[^2]。 ### 6. 代码访问安全性(CAS)与权限控制 尽管在.NET Core中传统的代码访问安全性(Code Access Security, CAS)已被弃用,但在.NET Framework中仍可使用它来限制程序集的权限,防止未经授权的控制流转移。例如,限制程序集访问文件系统或网络资源,从而防止恶意代码通过这些途径破坏控制流。 ```csharp PermissionSet ps = new PermissionSet(PermissionState.None); ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); AppDomain domain = AppDomain.CreateDomain("RestrictedDomain", null, new AppDomainSetup(), ps); ``` 通过限制执行环境的权限,可以有效控制程序的执行路径,防止控制流被恶意利用。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值