百分之九十的程序员都掌握的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#技巧的主要内容,如果未能解决你的问题,请参考以下文章

相信应该有百分九十的男生看见这个东西是这个状态吧?

Google 和 Baidu 常用的搜索技巧

Android Studio 调试

Android Studio 调试

前端面试百分之九十九过的技巧

历时2年《爱上Android》出版了