C#
类名修饰符
- public: 任何人都可以访问
- internal: 默认修饰符,只有在同一个命名空间下才可以访问
配置文件
- ASP.NET 配置文件为 web.config
- 桌面程序如 WinForm 为 App.config
多项目开发
- 右键添加引用, 本质上是命令行添加了 dll 的查找路径
索引器(indexer)
代码实例
public 返回类型 this[参数]
{
get
{
}
set
{
// 值为 value
}
}
- 索引器可以为只读或者只写(只写 get 或者 set)
- 编译成 IL 时转换为 get_Item 和 set_Item
特殊的类
密闭类
- 使用 sealed 关键字修饰, sealed 类不能有子类
静态类
- 使用 static 修饰的类
- 只能声明 static 属性和方法
- 在静态类中可以定义某一个现有类的扩展方法, 只需要在想要扩展的静态方法的定义中的第一个参数使用 this 修饰, 第一个参数的类型就是被扩展的类的对象; 但是这个只是语法糖, 最终还是会被编译成普通的静态方法调用
类
Property
定义属性
public 类型 属性名
{
get;
set;
}
值类型
结构体(包括 Int32 等)
- 隐式继承自 System.ValueType(所有的值类型都继承该类, 同时值类型是 sealed)
- 使用方式和类一样, 不同的是它是创建在栈中的, 拷贝是深拷贝
其他
数值类型(int, int 就是 Int32), 布尔类型, 枚举类型
判断对象是否相等
- 比较地址使用 object.ReferenceEquals(obj1, obj2)
- 如果我们自己创建新的类, 则==比较的是地址, 可以进行运算符重载
- Equals 默认比较地址, 可以重载
ref 和 out 应用
ref 类似 C 语言中 & 的取地址符号, 可以在函数内部改变指针的指向从而改变传入参数指针的指向, 对于值类型, 使用 ref 可以很方便实现 Swap 方法
out 用于返回多个值, 如果使用了 out, 一般方法的原始返回值就是 bool 类型, 用来表明是否成功
在 C# 中, 一般方法名以 Try 开头的不会抛出异常, 而是返回是否成功的 bool 类型, 并使用 out 返回其他返回值
委托
- 本质就是将方法当作对象来使用, 在 C# 中表现为一个数据类型
- 委托和类一样都是数据类型, 所以不能在类中定义类型, 需要直接在命名空间定义
- 示例代码
delegate 返回类型 方法名(委托数据类型名)(参数列表);
- 创建委托
委托类型 d = new 委托类型(需要委托的方法);
// 也可以使用 委托类型 d = 需要委托的方法;
d(参数); // 调用委托的函数
- 委托需要用户自定义类型, 比较麻烦, 微软添加了 Action 和 Func 委托, 方便我们使用委托, 不需要自定义委托数据类型, 一般也不自定义委托数据类型
内置泛型委托
Action
- 没有返回值, 有参数
Func
- 有一个返回值, 有多个参数, 最后一个参数为传出参数
委托的组合
使用 + 号实现委托累加(需要类型相同), 按照顺序效用委托的方法
使用 - 号实现委托删除
事件
事件是委托数据类型定义的一个变量(委托对象), 但是需要使用 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
使用
- Regex.IsMatch("文本", "正则表达式") 返回 bool
- Regex.Match("文本", "正则表达式") 返回 Match 对象
- match.Groups[0] 匹配的组
- 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)