C#

类名修饰符

  1. public: 任何人都可以访问
  2. internal: 默认修饰符,只有在同一个命名空间下才可以访问

配置文件

  1. ASP.NET 配置文件为 web.config
  2. 桌面程序如 WinForm App.config

多项目开发

  1. 右键添加引用, 本质上是命令行添加了 dll 的查找路径

索引器(indexer)

代码实例

public 返回类型 this[参数]

{

get

{

   

}

set

{

// 值为 value

}

}

  1. 索引器可以为只读或者只写(只写 get 或者 set)
  2. 编译成 IL 时转换为 get_Item 和 set_Item

特殊的类

   

密闭类

  1. 使用 sealed 关键字修饰, sealed 类不能有子类

静态类

  1. 使用 static 修饰的类
  2. 只能声明 static 属性和方法
  3. 在静态类中可以定义某一个现有类的扩展方法, 只需要在想要扩展的静态方法的定义中的第一个参数使用 this 修饰, 第一个参数的类型就是被扩展的类的对象; 但是这个只是语法糖, 最终还是会被编译成普通的静态方法调用

   

Property

定义属性

public 类型 属性名

{

get;

set;

}

值类型

   

结构体(包括 Int32 等)

  1. 隐式继承自 System.ValueType(所有的值类型都继承该类, 同时值类型是 sealed)
  2. 使用方式和类一样, 不同的是它是创建在栈中的, 拷贝是深拷贝

   

其他

数值类型(int, int 就是 Int32), 布尔类型, 枚举类型

判断对象是否相等

  1. 比较地址使用 object.ReferenceEquals(obj1, obj2)
  2. 如果我们自己创建新的类, 则==比较的是地址, 可以进行运算符重载
  3. Equals 默认比较地址, 可以重载

ref out 应用

ref 类似 C 语言中 & 的取地址符号, 可以在函数内部改变指针的指向从而改变传入参数指针的指向, 对于值类型, 使用 ref 可以很方便实现 Swap 方法

   

out 用于返回多个值, 如果使用了 out, 一般方法的原始返回值就是 bool 类型, 用来表明是否成功

   

在 C# 中, 一般方法名以 Try 开头的不会抛出异常, 而是返回是否成功的 bool 类型, 并使用 out 返回其他返回值

委托

  1. 本质就是将方法当作对象来使用, C# 中表现为一个数据类型
  2. 委托和类一样都是数据类型, 所以不能在类中定义类型, 需要直接在命名空间定义
    1. 示例代码

      delegate 返回类型 方法名(委托数据类型名)(参数列表);

    2. 创建委托

      委托类型 d = new 委托类型(需要委托的方法);

      // 也可以使用 委托类型 d = 需要委托的方法;

      d(参数); // 调用委托的函数

         

  3. 委托需要用户自定义类型, 比较麻烦, 微软添加了 Action 和 Func 委托, 方便我们使用委托, 不需要自定义委托数据类型, 一般也不自定义委托数据类型

   

内置泛型委托

Action

  1. 没有返回值, 有参数

   

Func

  1. 有一个返回值, 有多个参数, 最后一个参数为传出参数

   

委托的组合

使用 + 号实现委托累加(需要类型相同), 按照顺序效用委托的方法

使用 - 号实现委托删除

   

   

事件

事件是委托数据类型定义的一个变量(委托对象), 但是需要使用 event 关键字修饰, 事件与委托的使用区别就是事件不同从非空变为空

事件内部封住了委托, 可以选择重写事件的 add 和 remove 方法

匿名方法

使用 delegate 关键字

delete(参数)

{

   

}

   

Lambda 表达式

(int i) => {Console.WriteLine(i);}

(int i) => Console.WriteLine(i);

(i) => Console.WriteLine(i);

i => Console.WriteLine(i);

i => "i == " + i

反射(System.Reflection)

每个类都一个静态 Type 类型的变量

   

获取 Type 对象方法

  • obj.GetType()
  • typeof(obj)
  • Type.GetType("namespace")

   

创建对象

  • Activator.CreateInstance(typeObj)
  • ConstructorInfo c = GetConstructor(new Type[]{typeof(string), typeof(int)})

   

Type 的属性和方法

  • BaseType
  • Name
  • FullName(有命名空间)
  • IsArray()
  • IsPublic()
  • GetConstructor(Type[])
  • GetFields()
  • GetMethods()
  • GetMethod("name")
    • Invoke()
  • GetMethod("name", Type[])
  • GetProperties()
  • GetProperty("name")
    • SetValue()
  • GetAttributes()

   

反射应用

   

Attribute

  • 一般用来添加元信息(被反射读取), 起到辅助的作用, 它是被反射所利用的, 反射中使用 GetCustomAttributes() 获取当前被修饰的属性或者方法上的 Attributes(使用GetCustomAttribute(Type)获取特定的 Attribute, 找不到返回空), 通过分析获取到的 Attribute, 实现一些辅助的功能
  • 定义 Attribute(继承 Attribute 类) 时, 命名以 Attribute 结尾, 但是再使用的时候可以省略后缀

正则表达式

   

命名空间

System.Text.RegularExpressions

   

使用

  1. Regex.IsMatch("文本", "正则表达式") 返回 bool
  2. Regex.Match("文本", "正则表达式") 返回 Match 对象
    1. match.Groups[0] 匹配的组
      1. Value 获取匹配的字符串

   

   

XML 使用

示例代码

XmlDocument doc = new XmlDocument();

// doc.Load(path);

XmlNodeList nodes = Doc.DocumentElement.ChildNodes;

for (XmlNode node in nodes)

{

XmlElement ele = (XmlElement)node;

// 标签的属性

string name = node.GetAttribute("propertyName");

// 标签的子标签

XmlNode n = ele.SelectSingleNode();

// AppendChild 用于添加节点

// SetAttribute(name, value) 设置属性

}

// doc.Save(path)

   

posted @ 2020-04-05 11:40  gogogo11  阅读(267)  评论(0编辑  收藏  举报