1、动态(Dynamic)类型

可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。

dynamic d = 20;

2、整数常量

前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制。

85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* int */
30u        /* 无符号 int */
30l        /* long */
30ul       /* 无符号 long */

整数常量也可以有后缀,可以是 U 和 L 的组合,其中,U 和 L 分别表示 unsigned 和 long。后缀可以是大写或者小写,多个后缀以任意顺序进行组合。

3、字符常量

字符串常量是括在双引号 “” 里,或者是括在 @”” 里。

4、C#封装

  • internal:同一个程序集的对象可以访问;
  • protected internal:访问限于当前程序集或派生自包含类的类型。

5、参数传递

方式描述
值参数这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。
引用参数这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。
输出参数这种方式可以返回多个值。

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

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

publicvoid swap(refint x, refint y) {}

6、按输出传递参数

return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值(以上)。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。

7、可空类型

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

8、合并运算符(??

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

如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。

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

9、使用 foreach 循环

foreach (int j in n )
         {
            //Console.WriteLine(“Element[{0}] = {1}”, i, j);
         }

n从0开始直到结束,j用来存储每一次的数据

10、c#参数数组

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

11、类与结构体

①结构体中声明的字段无法赋予初值,类可以

② 结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制

如何选择:

首先明确,类的对象是存储在堆空间中,结构体存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构体可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。

12、析构函数

析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。

13、类限制符

通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。

14、虚方法

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。虚方法是使用关键字 virtual 声明的。

15、重载与多态

多态性包括:

静态多态性: 函数的响应是在编译时发生的 (函数重载、运算符重载)

动态多态性: 函数的响应是在运行时发生的 (抽象类)

多态性包含重载

16、命名空间

关键字:namespace

举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

命名空间可以嵌套

17、using关键字

using 关键字表明程序使用的是给定命名空间中的名称。

18、c#预处理命令

预处理器指令指导编译器在实际编译开始之前对信息进行预处理。

预处理器指令描述
#define它用于定义一系列成为符号的字符。
#undef它用于取消定义符号。
#if它用于测试符号是否为真。
#else它用于创建复合条件指令,与 #if 一起使用。
#elif它用于创建复合条件指令。
#endif指定一个条件指令的结束。
#line它可以让您修改编译器的行数以及(可选地)输出错误和警告的文件名。
#error它允许从代码的指定位置生成一个错误。
#warning它允许从代码的指定位置生成一级警告。
#region它可以让您在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块。
#endregion它标识着 #region 块的结束。

19、c#特性

.Net 框架提供了三种预定义特性:

  • AttributeUsage: 预定义特性 AttributeUsage 描述了如何使用一个自定义特性类
  • Conditional: 这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符
  • Obsolete: 这个预定义特性标记了不应被使用的程序实体

20、c#索引器

索引器(Indexer) 允许一个对象可以像数组一样被索引。当为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。可以使用数组访问运算符([ ])来访问该类的实例

element-type this[int index]
{
   // get 访问器
   get
   {
      // 返回 index 指定的值
   }

   // set 访问器
   set
   {
      // 设置 index 指定的值
   }
}

分类: C语言

0 条评论

发表评论

电子邮件地址不会被公开。