C#
本随笔为个人复习巩固知识用,多从书上总结与理解得来,如有错误麻烦指正
2020-12-04
1.预处理
使用预处理,可以使程序编译或者不编译某些代码,C#的预处理不支持宏,功能比较少。
使用预处理首先要使用关键词及#define定义一个预处理标识符,名称任意,但只影响当前的C#代码,它必须被定义到using前,然后使用#if,#else,#endif等关键词处理判断预处理是否存在。
#if SERVER Console.WriteLine("Server"); //如果定义SERVER,编译这里 #elif CLIENT Console.WriteLine("Client"); //如果定义CLIENT,编译这里 #else Console.WriteLine("?"); //否则编译这里 #endif
2.类
类是面向对象编程的基本元素,它是对现实世界的抽象,即可以将每一个事物看作是一种类型。
定义一个类
public class Player //public是作用域,class表示类,Player是类的名称 { public int id { get; set; } //类的成员属性 private string name = string.Empty; //类的成员变量 public Player() //构造函数,名称与类名一致,无返回值,实例化时函数会被自动调用 { } public void Init() { } //类的成员函数 }
C#使用关键字new实例化类的对象,并保证类的对象一定是引用类型,引用类型和内置类型的区别是,引用类型在没有使用new分配内存之前的值为null,使用new为其分配内存后,引用类型的值是指保存对象数据的内存地址而不是对象的数据本身。
static void Mian(String[] args) { Player player = new Player();//实例化Player对象,player的值指向一块内存地址 player.Init(); //调用公有成员函数 Player playerCopy = player; //playerCopy与player指向同一内存地址 playerCopy.id = 2; //这是playerCopy.id等于2 playerCopy = null; //playerCopy值为null,但对player没影响 player = null; //player的值为null,当没有变量引用到实例化对象,Player对象被自动删除 }
C#提供了垃圾回收器,当程序执行到对象的作用域以外或者没有任何变量引用到实例化的对象时,对象会自动被系统垃圾回收,因此不需要显示delete销毁,但是垃圾回收有一定的性能代价。在程序设计上要避免产生频繁的垃圾回收。
3.this
每个类的方法中都可以用this关键词指向当前对象,使用它可以避免一些歧义默认可以被省略,但当返回值是本身时就能用到this。(书上讲的很模糊,这边还是弄个具体例子出来辅助理解)
public class Animation { private bool m = false; public Animation Play()//返回值是当前对象 { return this; } public Animation Loop(bool n) { this.m = n;//这里的this可以省略 return this; } } class Program { static void Mian(String[] args) { Animation anim = new Animation(); anim.Play().Loop(true); //因为返回的是当前的对象可以像例子一样调用 } }
后续应该会另开一篇说一下
4.封装
面向对象编程的核心是封装丶继承和多态
C#使用访问修饰符决定类或类成员的可见性
在定义类的时候,在成员属性和方法前加上修饰符即可决定其可见性,如果不加任何修饰符,默认为private
public class SomeClass { public int a = 0; int b = 0; public void Test() { } private void Forbiidden() { } }
通过set和get的使用可改变封装变量属性为‘可读’与‘可写’,set方式有一个隐藏参数value指向属性的参数。
我的参考书上描述get作用为改为 “只读”,我认为描述为 “可读”更合适
如下示例
public class Player { private string m_name = "";//私有 public string Name { set { m_name = value; } get { return m_name; } } private int m_life = 100;//私有 public int Life { get { return m_life; } } }