博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#技巧记录——持续更新
阅读量:5275 次
发布时间:2019-06-14

本文共 8015 字,大约阅读时间需要 26 分钟。

作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新

对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数,规定T类型必须实现IUser,规定T必须为struct

where T : class, new(), T:IUser, T:Struct

 

创建别名,实现C的typedef类似的功能

using MyInt=System.Int32;//为Int32定义别名

 创建从当日00:00:00开始的时间

DateTime date=DateTime.Now;date=date.Date;    //通过返回时间的日期部分来解决时间置为0的问题

 

 创建从当月1日到最后一天的时间

DateTime start = DateTime.Now.AddDays(-(int)DateTime.Now.Day + 1).Date;DateTime end = start.AddMonths(1).AddDays(-1);

 获取从当年第一天到最后一天的时间

DateTime start = DateTime.Now.AddDays(-DateTime.Now.DayOfYear+1).Date; DateTime end = start.AddYears(1);

 获取当季度第一天到最后一天

int quarter = 0;                switch (DateTime.Now.Month)                {                    case 3:                    case 4:                    case 5:                        quarter = 3;break;                    case 6:                    case 7:                    case 8:                        quarter = 6; break;                    case 9:                    case 10:                    case 11:                        quarter = 9; break;                    case 12:                    case 1:                    case 2:                        quarter = 12; break;                }                DateTime start = DateTime.Now.AddDays(-DateTime.Now.DayOfYear+1).Date.AddMonths(quarter-1);                DateTime end = start.AddMonths(3).AddDays(-1);

 定义长字符串包含特殊字符

string longStr = @"\[][;\&";

条件编译

//DEBUG一般为编译器预定义的特殊变量,用于表示是否为调试模式//也可以自定义,使用#define,并声明在文件开始处,同C/C++#if DEBUG            Console.Write("debug");#else            Console.Write("un debug");#endif          #if aa            Console.WriteLine("我是A");#else            Console.WriteLine("我是B");#endif

 ref out

//通过ref传递引用//使用ref传递的值必须初始化void show(ref int x){    Console.Write(x)}int i=9;show(ref i);//解决了ref需要初始化的问题,使用out不需要对变量进行初始化void show(out int x){    Console.Write(x)}int i;show(out i);

 命名参数

//可以随意交换实参的顺序,冒号之前指定参数名,冒号之后指定值,与swift一致public static void show(int x,int y){        Console.Write("{0},{1}",x,y);}show(y:9,x:20);

 自动实现属性

public int Age{        get;set;}

 静态构造函数

//在第一次引用类型的之前调用静态构造函数class test    {        static int count;        static test()        {            count = 1;        }        public test()        {                    }        public  void show()        {            Console.Write(count);        }    }

 readonly

class test    {        readonly int count=0;//只允许在初始化或构造函数中修改值        public test()            {            count = 1;                    }        public  void show()        {            //count = 3;    错误            Console.Write(count);        }        public int Age            {                get;set;            }    }

 匿名类型

//常使用创建类的方式来描述json对象,并需要每次创建新的类,//使用匿名对象便可解决此问题 var a = new { age = 0,name="lilei" }; Console.Write(a.age+" "+a.name);

 

合并运算符

//当我们在使用可空类型的时候经常需要判断值是否为空//例如int ? x;if(x==null){ //...   }else{    //...}//这个时候我们便可以使用合并运算符来处理// 当x非空时,a的值为x的值。若x为空,a的值为0;int a=x??0;

 

多维数组定义

//数组定义本身并不困难,这里仅作为和C不同的风格才记录下来,以提醒自己int [,] users=new int[2,2];

 排序

//数组提供的快速排序算法//要求数组类型是已实现了IComparable接口的类型int[] te = { 555,6,2,1,65,99,45,63};            Console.Write("*******************\n");Array.Sort(te);for (int i = 0; i < te.Length; i++){    Console.Write(te[i] + "\n");}

 

 字符串分割匹配多个字符

str.Split('a','b','c');

  使用\r\n分割字符串

var infoStr = examInfo.Split(new string[] { "\r\n" },                        StringSplitOptions.RemoveEmptyEntries);

 linq

//linq语法与sql类似,不同之处需要将from提前,//便于类型推测,select语句放到最后//其中d为查询后的对象//in后为查询的数据来源int[] ary = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };            var resul = from d in ary                        where d == 1                        select d;            foreach (var item in resul)            {                MessageBox.Show(item.ToString());            }//可为查询对象设置类型,from后的int,如下//如果类型错误会产生运行时异常int[] ary = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };            var resul = from int d in ary                        where d == 1                        select d;            foreach (var item in resul)            {                MessageBox.Show(item.ToString());            }

 使用共享模式读写文件

//共享模式写文件using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))            {                fs.SetLength(0);                using (StreamWriter writer = new StreamWriter(fs,Encoding.Default))                {                    string infos = JsonConvert.SerializeObject(info.data);                    writer.Write(infos);                    writer.Flush();                    writer.Dispose();                }                fs.Dispose();            }//共享模式读取文件            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.ReadWrite))            {                fs.SetLength(0);                using (StreamReader reader = new StreamReader(fs))                {                    string lifeStr=reader.ReadToEnd();                }                fs.Dispose();            }

static&&const

static 表示静态的const 表示静态的常量

using static

using static Console;class Pragram{    //使用using static已经导入了,这里不用加Console     Write("Hello");   }

 ILDSAM

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools //在类似目录下

 byte、sbyte

byte:无符号sbyte:有符号

 插值字符串

int a=9;string b=$"a:{a}";//使用变量或表达式值填充

 lambda表达式

int getDouble(int x)=>x*x;

 可变个数的参数

//使用关键字paramspublic static void G(params int[] d)        {            foreach (var item in d)            {                Write(item);            }        }

 构造函数初始化器

class A{        A(int i)        {            B = i;        }//自动调用相应的构造函数,在此构造函数体之前执行        A():this(1)        {            }

静态构造函数

static A(){      //在第一次调用之前自动初始化          }

readonly

class A{    readonly int a;    A()    {        //只能在构造函数中初始化,否则将为该类型的默认值        a=9;    }    }

 表达式体属性(声明类成员时使用lambda)

class A{    int a;    int b;    int c=>a+b;}

 匿名类型

var zhangsan=new {     name="zhangsan";     age=20   };

 override new

如果你用override,则无论调用的是A类还是B类中的TEST(),系统都会找到它实质类的TEST();如果是用的New,则可以通过类型转换调用到基类的TEST();

 获取[Description("")]

public static class EnumHelper    {        public static string GetDescription(this Enum enumeration)        {            Type type = enumeration.GetType();            MemberInfo[] memInfo = type.GetMember(enumeration.ToString());            if (null != memInfo && memInfo.Length > 0)            {                object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);                if (null != attrs && attrs.Length > 0)                    return ((DescriptionAttribute)attrs[0]).Description;            }            return enumeration.ToString();        }    }

 is as

is返回判断结果true falseas返回转换后的引用,如果转换失败返回null,转换失败均不抛出异常

 空值运算符

//空指针异常//string i=null ;//Console.WriteLine(i.ToString());//输出空白字符string i = null;Console.WriteLine(i?.ToString());Console.WriteLine("end");

 nameof

//获取方法或类的名称

 default获取类型默认值

int i=default(int);

 checked unchecked

检测代码块是否计算过程中发生溢出,一般不需要unchecked(默认为不检测)

 

 

 ?空值传播与??空值合并

? //如果引用为空,则直接返回null ?? //如果不为空则返回变量值,否则返回??之后的值 var x = new { a = "a", b = "b" };//如果x为空,则直接返回nullvar xx = x?.a ?? "";

 action func

void a() { }int b() { return 0; }void test(){    Action ax=new Action(a);    Func
af = new Func
(b);}

 Lazy<>延迟加载

public class Student   {      public Student()      {         this.Name = "DefaultName";         this.Age = 0;         Console.WriteLine("Student is init...");      }      public string Name { get; set; }      public int Age { get; set; }   } Lazy
stu = new Lazy
(); if(!stu.IsValueCreated) Console.WriteLine("isn't init!"); Console.WriteLine(stu.Value.Name); stu.Value.Name = "Tom"; stu.Value.Age = 21; Console.WriteLine(stu.Value.Name); Console.Read();

 WeakReference弱引用对象

弱引用:在引用对象的同时,允许垃圾回收该对象。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用

获取随机文件名

System.Console.WriteLine(Path.GetRandomFileName());System.Console.WriteLine(Path.GetTempFileName());System.Console.WriteLine(Path.GetTempPath());

 显示TODO标

视图->任务列表

 

 
 
 

转载于:https://www.cnblogs.com/ives/p/6748920.html

你可能感兴趣的文章
了解keycode
查看>>
自测题.
查看>>
实现 memcpy
查看>>
配置router列表
查看>>
HDU 1698——Just a Hook——————【线段树区间替换、区间求和】
查看>>
用Backbone.js创建一个联系人管理系统(一)
查看>>
Could not parse configuration: /hibernate.cfg.xml
查看>>
中文词频统计及词云制作
查看>>
3237: [Ahoi2013]连通图 线段树分治
查看>>
尚学堂Spring视频教程(二):Spring控制反转
查看>>
Python学习笔记之函数式编程
查看>>
PHP的反射机制
查看>>
Python面向对象
查看>>
js正則表達式--验证表单
查看>>
不信任的 .exe 怎么办,用 Windows 沙盒啊!
查看>>
【郭林专刊】JSP中JSTL提供的函数标签EL表达式操作字符串的方法
查看>>
【郭林专刊】10个步骤让你成为高效的Web开发者
查看>>
jQuery选中该复选框来实现/全部取消/未选定/获得的选定值
查看>>
Linux网络编程——连接和面向连接的协议之间没有区别
查看>>
strcpy_s与strcpy对照
查看>>