详情请参考:http://www.runoob.com/csharp/csharp-operators.html

1.C# 运算符

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 其他运算符

&,|,^ 除了用于位运算,还可以用于逻辑运算,分别对应与,或,异或。

C# 中的运算符优先级

2.C# 判断

switch 语句必须遵循下面的规则:

  • switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。
  • 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
  • case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量。
  • 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
  • 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
  • 不是每一个 case 都需要包含 break。如果 case 语句为空,则可以不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
  • C# 不允许从一个开关部分继续执行到下一个开关部分。如果 case 语句中有处理语句,则必须包含 break 或其他跳转语句。
  • 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
  • C# 不支持从一个 case 标签显式贯穿到另一个 case 标签。如果要使 C# 支持从一个 case 标签显式贯穿到另一个 case 标签,可以使用 goto 一个 switch-case 或 goto default。

? : 运算符

条件运算符 ? :,可以用来替代 if...else 语句

3.C# 循环

  1.        int[] ints = { ,,,,};
  2. foreach(int myInt in ints)
  3. {
  4. System.Console.WriteLine(myInt);
  5. }
  6. Console.WriteLine();

循环控制语句

无限循环

如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,可以将某些条件表达式留空来构成一个无限循环。

  1. for (; ; )
  2. {
  3. Console.WriteLine("Hey! I am Trapped");
  4. }
    当条件表达式不存在时,它被假设为真。您也可以设置一个初始值和增量表达式,但是一般情况下,程序员偏向于使用 for(;;) 结构来表示一个无限循环。

4.C# 封装

封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。

抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象

C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。

一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:

  • public:所有对象都可以访问;
  • private:对象本身在对象内部可以访问;
  • protected:只有该类对象及其子类对象可以访问;
  • internal:同一个程序集的对象可以访问;
  • protected internal:访问限于当前程序集或派生自包含类的类型。
  1. http://www.runoob.com/csharp/csharp-encapsulation.html

5.C# 方法

一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。

C# 中定义方法

在 C# 中,定义方法的语法如下:

  1. <Access Specifier> <Return Type> <Method Name>(Parameter List)
  2. {
  3. Method Body
  4. }
  1. public int FindMax(int num1, int num2)
  2. {
  3. /* 局部变量声明 */
  4. int result;
  5.  
  6. if (num1 > num2)
  7. result = num1;
  8. else
  9. result = num2;
  10.  
  11. return result;
  12. }

C# 中调用方法

  1.        NumberManipulator n = new NumberManipulator();
  2. //调用 FindMax 方法
  3. ret = n.FindMax(a, b);
  4. Console.WriteLine("最大值是: {0}", ret );

递归方法调用

一个方法可以自我调用。这就是所谓的 递归

参数传递

  1. C# 中,有三种向方法传递参数的方式:

按值传递参数

即使在函数内改变了值,值也没有发生任何的变化。

  1. public void swap(int x, int y)
  2. {
  3. int temp;
  4.  
  5. temp = x; /* 保存 x 的值 */
  6. x = y; /* 把 y 赋值给 x */
  7. y = temp; /* 把 temp 赋值给 y */
  8. }

按引用传递参数

引用参数是一个对变量的内存位置的引用。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。

在 C# 中,使用 ref 关键字声明引用参数。

  1. public void swap1(int a, int b)
  2. {
  3. int x = a;
  4. a = b;
  5. b = x;
  6. }
  7. public void swap2(ref int a, ref int b)
  8. {
  9. int x = a;
  10. a = b;
  11. b = x;
  12. }
  1. int x=;
  2. int y=;
  3. animal.swap1(x, y);
  4. Console.WriteLine("before:"+x);
  5. Console.WriteLine("before:" + y);
  6. animal.swap2(ref x,ref y);
  7. Console.WriteLine("after:" + x);
  8. Console.WriteLine("after:" + y);

按输出传递参数

  1. return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。
  1. public void getValues(out int x, out int y )
  2. {
  3. Console.WriteLine("请输入第一个值: ");
  4. x = Convert.ToInt32(Console.ReadLine());
  5. Console.WriteLine("请输入第二个值: ");
  6. y = Convert.ToInt32(Console.ReadLine());
  7. }
  8.  
  9. static void Main(string[] args)
  10. {
  11. NumberManipulator n = new NumberManipulator();
  12. /* 局部变量定义 */
  13. int a , b;
  14.  
  15. /* 调用函数来获取值 */
  16. n.getValues(out a, out b);
  17.  
  18. Console.WriteLine("在方法调用之后,a 的值: {0}", a);
  19. Console.WriteLine("在方法调用之后,b 的值: {0}", b);
  20. Console.ReadLine();
  21. }

一个用关键字 ref 标示,一个用 out 标示。

牵扯到数据是引用类型还是值类型。

一般用这两个关键字你是想调用一个函数将某个值类型的数据通过一个函数后进行更改。传 out 定义的参数进去的时候这个参数在函数内部必须初始化。否则是不能进行编译的。ref 和 out 都是传递数据的地址,正因为传了地址,才能对源数据进行修改。

一般情况下不加 ref 或者 out 的时候,传值类型的数据进去实际上传进去的是源数据的一个副本,也就是在内存中新开辟了一块空间,这里面存的值是与源数据相等的,这也就是为什么在传值类型数据的时候你如果不用 return 是无法修改原值的原因。但是你如果用了 ref,或者 out,这一切问题都解决了,因为他们传的是地址。

out 比起 ref 来说,还有一个用法就是可以作为多返回值来用,都知道函数只能有一个返回值,C#里,如果想让一个函数有多个返回值,那么OUT能很容易解决。

6.C# 可空类型(Nullable)

? : 单问号用于对 int,double,bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 NullAble 类型的。

  1. int? i =
  2. 等同于
  3. Nullable<int> i = new Nullable<int>();
  4.  
  5. int i; //默认值0
  6. int? ii; //默认值null

?? : 双问号 可用于判断一个变量在为 null 时返回一个指定的值。

C# 可空类型(Nullable)

  1. C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。
    例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 2,147,483,647 之间的任意值,也可以被赋值为 null 值。类似的,Nullable< bool > 变量可以被赋值为 true false null
    在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true false,或者,该字段也可以未定义。

声明一个 nullable 类型(可空类型)的语法如下:

  1. < data_type> ? <variable_name> = null;
  1.      int? num1 = null;
  2. int? num2 = ;
  3. double? num3 = new double?();
  4. double? num4 = 3.14157;
  5.  
  6. bool? boolval = new bool?();
  7.  
  8. // 显示值
  9.  
  10. Console.WriteLine("显示可空类型的值: {0}, {1}, {2}, {3}",
  11. num1, num2, num3, num4);
  12. Console.WriteLine("一个可空的布尔值: {0}", boolval);
  13. Console.ReadLine();

Null 合并运算符( ?? )

  1.  Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 NullNull 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。

如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。下面的实例演示了这点:

  1. double? num1 = null;
  2. double? num2 = 3.14157;
  3. double num3;
  4. num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
  5. Console.WriteLine("num3 的值: {0}", num3);
  6. num3 = num2 ?? 5.34;
  7. Console.WriteLine("num3 的值: {0}", num3)

7.C# 数组(Array)

声明数组:

  1. datatype[] arrayName;
    例如:
  1. double[] balance;

初始化数组

声明一个数组不会在内存中初始化数组。当初始化数组变量时,可以赋值给数组。

数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。

  1. double[] balance = new double[10];

赋值给数组

可以通过使用索引号赋值给一个单独的数组元素

  1. double[] balance = new double[10];
  2. balance[0] = 4500.0;
  3.  
  4. 也可以在声明数组的同时给数组赋值,比如:
  1. double[] balance = { 2340.0, 4523.69, 3421.0};
  2.  
  3. 也可以创建并初始化一个数组,比如:
  1. int [] marks = new int[5] { 99, 98, 92, 97, 95};

在上述情况下,也可以省略数组的大小,比如:

  1. int [] marks = new int[] { 99, 98, 92, 97, 95};

也可以赋值一个数组变量到另一个目标数组变量中。在这种情况下,目标和源会指向相同的内存位置:

  1. int [] marks = new int[] { 99, 98, 92, 97, 95};
  2. int[] score = marks;
  1. 当创建一个数组时,C# 编译器会根据数组类型隐式初始化每个数组元素为一个默认值。例如,int 数组的所有元素都会被初始化为 0。

访问数组元素

元素是通过带索引的数组名称来访问的。这是通过把元素的索引放置在数组名称后的方括号中来实现的。例如:

  1. double salary = balance[9];

C# 数组细节

——C# 多维数组

  1. int [,] a = new int [,] {
  2. {, , , } , /* 初始化索引号为 0 的行 */
  3. {, , , } , /* 初始化索引号为 1 的行 */
  4. {, , , } /* 初始化索引号为 2 的行 */
  5. };
  1. int val = a[2,3];
  2.  
  3. ———C# 交错数组

交错数组是数组的数组。可以声明一个带有 int 值的交错数组 scores,如下所示:

  1. int [][] scores;
  1. int[][] scores = new int[5][];
  2. for (int i = 0; i < scores.Length; i++)
  3. {
  4. scores[i] = new int[4];
  5. }
    int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
  1. 其中,scores 是一个由两个整型数组组成的数组 -- scores[0] 是一个带有 3 个整数的数组,scores[1] 是一个带有 4 个整数的数组。
  1.  ————C# 传递数组给函数
    可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
    ————C# 参数数组
    当声明一个方法时,不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。

params 关键字

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用格式为:

  1. public 返回类型 方法名称( params 类型名称[] 数组名称 )
  1. class ParamArray
  2. {
  3. public int AddElements(params int[] arr)
  4. {
  5. int sum = ;
  6. foreach (int i in arr)
  7. {
  8. sum += i;
  9. }
  10. return sum;
  11. }
  12. }
  13.  
  14. class TestClass
  15. {
  16. static void Main(string[] args)
  17. {
  18. ParamArray app = new ParamArray();
  19. int sum = app.AddElements(, , , , );
  20. Console.WriteLine("总和是: {0}", sum);
  21. Console.ReadKey();
  22. }
  23. }

——C# Array 类

  1. Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义。Array 类提供了各种用于数组的属性和方法。
    http://www.runoob.com/csharp/csharp-array-class.html

C#简述(二)的更多相关文章

  1. 【C++】异常简述(二):C++的异常处理机制

    上文简述了在C语言中异常的处理机制,本文主要讲解C++中的异常处理. 一.异常的语法格式 在C++中,异常的抛出和处理主要使用了以下三个关键字:try. throw . catch.其格式如下: 当我 ...

  2. 【C++】模板简述(二):函数模板

    我们上文讲了,模板的引入,我们发现在某种特殊的情况下,必须得通过模板才能完美的解决问题. 本文就来简述一下函数模板的基本使用. 一.函数模板格式 template<typename Param1 ...

  3. Java从零开始学四十一(反射简述二)

    一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...

  4. SAP Marketing Cloud功能简述(二) : Target Group

    这个系列的第一篇文章 SAP Marketing Cloud功能简述(一) : Contacts和Profiles,我向大家介绍了SAP Marketing Cloud里的Contacts和Profi ...

  5. Quartz 2D在ios中的使用简述二:创建画布

    在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...

  6. 【C++】智能指针简述(二):auto_ptr

    首先,我要声明auto_ptr是一个坑!auto_ptr是一个坑!auto_ptr是一个坑!重要的事情说三遍!!! 通过上文,我们知道智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析 ...

  7. 【C++】模板简述(六):总结

    1.模板技术是泛型编程的基础.([C++]模板简述(一):模板的引入) 2.模板被编译两次,因而给分离编译造成一些麻烦.([C++]模板简述(二):函数模板.[C++]模板简述(四):模板为什么不支持 ...

  8. Qt之二维码扫描

    简述 二维码(QR Code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.是所有信息数据的一把钥匙.应用十分广泛,如:产品防伪/溯源.广告推送.网站链接. ...

  9. 原生JS实现二叉搜索树(Binary Search Tree)

    1.简述 二叉搜索树树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子 ...

  10. SAP Marketing Cloud功能简述(五) : 销售计划管理

    Grace前四篇介绍SAP Marketing Cloud的文章: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Cloud ...

随机推荐

  1. 支付宝即时到账接口开发 - DEMO讲解

    支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...

  2. 企业案例--生产环节更改mysql字符集

    查看数据库字符集: show database create dbname \G; 查看数据库表字符集: show table create tbname \G; 查看现有数据库字符集设置: show ...

  3. python利用smtplib和MIMETYPE发送邮件

    # -*- coding:utf- -*- import smtplib from email.mime.text import MIMEText sender = '你的发送邮件' my_pass= ...

  4. Ubuntu18.04安装Teamviewer

    首先,打开TeamViewer的下载页面,下载Debian/Ubuntu的Deb安装包. 这里有64位和32位安装包选项.可以在Terminal(终端)中输入uname -a 查看自己系统版本是64位 ...

  5. ansible-playbook如何判断并中断执行

    - fail: msg="Bailing out. this play requires 'bar'"       when: bar is not defined 我的需求是当某 ...

  6. [Dynamics 365] 关于Currency的一点随笔

    在Dynamics CRM中,如果我们要添加一条Currency记录的话. 可选择的Currency Type有<System> ,<Custorm>两种. 如果选择的是< ...

  7. c# update check

    public class UpdateChecker { public static event EventHandler completeCheck; private static bool isC ...

  8. spring配置多个事务管理器

    <tx:annotation-driven/> <bean id="transactionManager1" class="org.springfram ...

  9. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  10. SSIS 遍历目录,把文件内容导入数据库

    最近接手一个项目,程序的基本框架是:程序A导出数据,以.tsv格式存储,数据列之间以tab间隔:程序B吃文档,把数据导入到数据库中,并把处理过的文档备份/移动到指定的目录中.为了快速开发,程序B设计成 ...