百分之九十的程序员都掌握的C#技巧
Posted 肖尘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百分之九十的程序员都掌握的C#技巧相关的知识,希望对你有一定的参考价值。
1.C#匿名方法
【Anonymous methods】匿名方法,一般使用匿名方法进行回调。
本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值。
例:
static int Test1(int arg1, int arg2)
return arg1 + arg2;
Func<int,int,int>plus = Test1;
改为:
Func<int,int,int>plus = delegate(int arg1,int arg2)
return arg1 +arg2;
2.Lambda表达式
用来代替匿名方法。
lambda表达式的参数不需要声明类型
Func<int,int,int>plus = (arg1,arg2)=>
return arg1 +arg2;
3.【Event】事件
委托能声明一个局部变量,事件只能在类里面声明
例:
public delegate void MyDelegate();
public event MyDelegate mydelgate;//声明了一个委托类型的变量,作为类的成员。加上event
static void Main(string[] args)
Program p = new Program();
p.mydelgate = Test1;
p.mydelgate();
Console.ReadKey();
备注:观察者设计模式,被观察者设置一个委托(事件),观察者为委托注册自身方法
委托与事件的区别,事件不能在的外部触发,只能在类的内部。受限制的委托
4.【LINQ】查询代码
方法:
from…in…查询的集合
where 查询的条件
select 结果集合返回
扩展方法:
var res = masterList.Where()//传递一个方法作为过滤,或者直接在里面写lambad表达式
联合查询:
from A in AA from B in BB
where A.? = B.?
select new输出项
------
from A in AA join B in BB
on A.? equals B.?
select new输出项
var res = masterList.SelectMany(m=>kongfuList,(m,k)=>new master = m,kongfu = k)
.Where(x=>x.master.kongfu==x.kongfu.Name &&x.kongfu.Power>90);
结果排序:
orderby m.age,mLeverl descending
var res = masterList.Where(m => m.level > 8&&m.Menpai == "丐帮").OrderBy(m => m.Age);
分组查询:
var res = from k in konfuList join m in masterList on k.Name equals m.Kongfu
into groups
select new kongfu =k, count = groups.Count(),key=g.key;
量词操作:
bool res = masterList.Any(m => m.Menpai == "长留")//只要一个条件符合返回true
5.【Json】存储和交换文本信息的语法。
using LitJson;
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json技能信息.txt"));
//jsonMapper去解析json文本
//jsondata对象代表一个数组或者一个对象
foreach(JsonData temp in jsonData)//在这里temp代表一个对象
JsonData idvalue = temp["id"];//通过字符串索引器可以取得键值对的值
一般会创建对象处理
calss Skill
public int id;
public override string ToString()
List<Skill> skillList = new List<Skill>();
foreach(JsonData temp in jsonData)
Skill skill = new Skill();
skill.id = id
skillList.Add(skill);
foreach(var temp in skillList)
输出
6.C#反射
【Reflection】反射
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。
然后,可以调用类型的方法或访问其字段和属性。
获取Type对象有两种方式:
Type t = myInstance.GetType();//通过类的实例来获取Type对象
在object类有一个GetType的方法,返回Type对象,因为所有类都是从object继承的,
所以我们可以在任何类型上使用GetType()来获取它的Type对象
Type t = typeof(ClassName);//直接通过typeof运算符和类名获取Type对象获取里面的属性。
Assembly类:
Assembly类在System.Reflection命名空间中定义,它允许访问给定程序集的元数据,
它也包含了可以加载和执行程序集。
7.C#属性,索引
【Accessor】
访问器包含一个 get 访问器或一个 set 访问器。
【Indexer】
访问器包含一个 get 访问器或一个 set 访问器。索引器返回或设置对象实例的一个特定值。带有this关键字,它指向对象实例。
8.C#委托
【Delegate】委托(Delegate)特别用于实现事件和回调方法。即可用静态方法,也可用普通方法。
定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。
使用委托来调用对象方法。委托的多播使用,方法也可以调用委托
声明语法:delegate
例:
delegate int NumberChanger(int n);//声明委托
class......
public static int AddNum(int p)
num += p;
return num;
main......
NumberChanger nc1 = new NumberChanger(AddNum); // 创建委托实例
nc1(25); // 使用委托对象调用方法
【Func】内置的委托类型
引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。
【Action】内置的委托类型
委托引用了一个void返回类型的方法,它可以传递0或者多到16个参数类型。
指向带一个int参数的方法:Action a = PrintString
【Generic】泛型
9.C#特性
【Conditional】【Obsolete】【DebuggerStepThrough】
【Attribute】
是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明 性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面 的方括号([ ])来描述的。
预定义特性:
Conditional:这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。
例:
#define DEBUG //定义DEBUG
public class Myclass
[Conditional("DEBUG")] //如果没有定义DEBUG,则方法语句不运行
public static void Message(string msg)
Console.WriteLine(msg);
Obsolete:这个预定义特性标记不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。
[Obsolete("Don't use OldMethod, use NewMethod instead", true)]
static void OldMethod()
Console.WriteLine("It is the old method");
//当尝试编译时,编译器会给出一个错误消息说明,如上。
AttributeUsage:
语法如下:
[AttributeUsage(
validon, //规定特性可被放置的语言元素,枚举类型。
AllowMultiple=allowmultiple, //提供一个布尔值。如果为 true,则该特性是多用的。默认false。
Inherited=inherited //提供一个布尔值。如果为 true,则该特性可被派生类继承。默认false。
)]
创建自定义特性
声明自定义特性:AttributeUsage
构建自定义特性:创建一个类继承 System.Attribute
调用者信息特性
调用者信息特性可以访问文件路径,代码行数,调用成员的名称等源代码信息。
这个三个特性名称为CallerFilePath,CallerLineNumber和CallerMemberName
这些特性只能用于方法中的可选参数
10.读取文件几种形式:
string nextLine = sr.ReadLine();//读取一行字符串
string restOfStream = sr.ReadToEnd();//读取流中所有剩余的文本内容
int nextChar = sr.Read();//只读取一个字符
int nChars = 100;
char[] charArray = new char[nChars];
int nCharsRead = sr.Read(charArray,0,nChars); 读取多个字符,第一个参数是要存放的字符数组,
第二个参数是从数组哪一个索引开始放,第三个参数是读取多少个字符 返回值是实际读取的字符的个数
以上是关于百分之九十的程序员都掌握的C#技巧的主要内容,如果未能解决你的问题,请参考以下文章