查缺补漏
合并枚举 [Flags]
参考: Flags 特性 c#_c# flags属性-CSDN博客
[Flags] public enum Options { Insetred = 1, Update = 2, Query = 3, Delete = 4, ALL = Insetred | Update | Query | Delete }
User user = new User(); user.Option = Options.Delete | Options.Update; Console.WriteLine(user.Option.ToString()); //是否包含 枚举 if (user.Option.HasFlag(Options.Update)) { Console.WriteLine("用户可以更新"); } User user1 = new User(); user1.Option = Options.ALL; Console.WriteLine(user1.Option); if (user1.Option.HasFlag(Options.Delete)) { Console.WriteLine("用户可以删除"); }
C#解构器
参考: C#解构器_c# deconstruct-CSDN博客
关键字 Deconstruct 使用 Deconstruct(out DateTime createTime, out string orderCode)
public class Order
{
public Order(DateTime createTime, string orderCode)
{
CreateTime = createTime;
OrderCode = orderCode;
}
public DateTime CreateTime { get; set; }
public string OrderCode { get; set; }
public void Deconstruct(out DateTime createTime, out string orderCode)
{
createTime = CreateTime;
orderCode = OrderCode;
}
}
使用 (DateTime createTime, string orderCode) = order;
Order order =new Order(DateTime.Now,"订单001"); (DateTime createTime, string orderCode) = order; Console.WriteLine($"订单生成时间:{createTime.ToString("yyyy-MM-dd HH-mm-ss")},订单号:{orderCode}");
implicit 隐式转换 explicit 显示转换
静态 ,关键字 operator
public class Student { public Student(string all) { All = all; } public string All { get; set; } public static implicit operator Student(Person person) { return new Student(person.FirstName + " " + person.LastName); } public static explicit operator Person(Student student) { return new Person() { FirstName = student.All }; } }
使用
Console.WriteLine("====隐式转换====="); //隐式转换 Student student = person; Console.WriteLine(student.All); //显示转换 Person person3 = (Person)student; Console.WriteLine("====显示转换====="); Console.WriteLine(person3.FirstName);
ICollection
ICollection 接口是 System.Collections 命名空间中类的基接口,ICollection 接口扩展 IEnumerable,IDictionary 和 IList 则是扩展 ICollection 的更为专用的接口。如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。
ICollection是IEnumerable的加强型接口,它继承自IEnumerable接口,提供了同步处理、赋值及返回内含元素数目的功能
IEnumerable接口
1、IEnumerable接口是ICollection的父接口,凡实现此接口的类,都具备“可迭代”的能力。
2、IEnumerable接口只定义了一个方法:GetEnumerator,该方法将返回一个“迭代子”对象(或称为迭代器对象),是一个实现了IEnumerator接口的对象实例。
3、凡是实现了IEnumerable接口的类,都可以使用foreach循环迭代遍历。
4` 可以使用yield return 跳出循环 yield break
public IEnumerable<string> GetNames() { yield return "汤姆"; yield return "吉瑞"; }
使用
Console.WriteLine("====使用yied return====="); List<string> names = order.GetNames().ToList(); Console.WriteLine(string.Join(",", names)); Console.WriteLine("====使用yied return end=====");
c# DateTimeOffset DateTime TimeSpan 不同点
比较与日期和时间相关的类型 - .NET | Microsoft Learn
C#中 DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)-CSDN博客
事件
1第一种先 定义委托
/// <summary> /// 订单创建状态 /// </summary> /// <param name="orderCode"></param> /// <returns></returns> public delegate bool OrderStartDelegate(string orderCode); /// <summary> /// 订单关闭状态 /// </summary> /// <param name="orderCode"></param> /// <returns></returns> public delegate bool OrderCancelDelegate(string orderCode);
再定义 事件
OrderStartDelegate orderStartDelegate; public event OrderStartDelegate OrderStartEvent { add { orderStartDelegate += value; } remove { orderStartDelegate -= value; } }
public class Order { //第一种 OrderStartDelegate orderStartDelegate; public event OrderStartDelegate OrderStartEvent { add { orderStartDelegate += value; } remove { orderStartDelegate -= value; } } OrderCancelDelegate orderCancelDelegate;
//定义事件 public event OrderCancelDelegate OrderCancelEvent { add { orderCancelDelegate += value; } remove { orderCancelDelegate -= value; } } public event EventHandler<OrderPaymentSucceededArgs> OrderPaymentSucceededEvent; /// <summary> /// 创建订单 /// </summary> /// <returns></returns> public bool OrderStart() { //创建订单 bool? @bool = orderStartDelegate?.Invoke(OrderCode); return @bool.Value; }
}
第二种
先定义事件参数
/// <summary> /// 订单支持成功状态参数 /// </summary> public class OrderPaymentSucceededArgs : EventArgs { public OrderPaymentSucceededArgs(string orderCode) { OrderCode = orderCode; } public string OrderCode { get; set; } }
再定义事件
public class Order { public event EventHandler<OrderPaymentSucceededArgs> OrderPaymentSucceededEvent; public bool OrderPaymentSucceede() { OrderPaymentSucceededEvent?.Invoke(this, new OrderPaymentSucceededArgs(OrderCode)); return true; }
}
匿名类型
Console.WriteLine("=== 匿名类型====="); var address = new { street = "00号大街" }; Console.WriteLine(address.street);
linq
into 只能出现在select group 后边
into custormPurchases 为 purchase 序列
from cp in custormPurchases.DefaultIfEmpty()
为 展开 custormPurchases
var query = from custorm in custorms
join purchase in purchases.Where(item=>item.Price>5000) on custorm.Id equals purchase.CustormId into custormPurchases
from cp in custormPurchases.DefaultIfEmpty()
select new { custormName = custorm.Name, price = cp?.Price, productName = cp?.Name };
深入理解多线程中的yield方法
volatile
olatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。
1volatile的使用场景
多个线程同时访问一个变量,CLR为了效率,允许每个线程进行本地缓存,这就导致了变量的不一致性。volatile就是为了解决这个问题,volatile修饰的变量,不允许线程进行本地缓存,每个线程的读写都是直接操作在共享内存上,这就保证了变量始终具有一致性。
2、volatile 关键字可应用于以下类型的字段
(1)、引用类型
(2)、整型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
(3)、具有整数基类型的枚举类型。
(4)、已知为引用类型的泛型类型参数。
(5)、不能将局部变量声明为 volatile。
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变 量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:
- int i1; int geti1() {return i1;}
- volatile int i2; int geti2() {return i2;}
- int i3; synchronized int geti3() {return i3;}
AssemblyDescriptionAttribute
是 .NET 框架中的一个特性类,用于为程序集提供描述信息。
Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyDescriptionAttribute>();
.NetCore MemoryCache使用详解
1.ExpirationScanFrequency获取或设置对过期项的连续扫描之间的最短时间间隔
2.SizeLimit 缓存是没有大小的的,此值设置缓存的份数
3.CompactionPercentage获取或设置在超过最大大小时压缩缓存的数量,优先压缩优先级较低的缓存,0.2代表20%
services.AddMemoryCache(options => { // 缓存最大为100份 //##注意netcore中的缓存是没有单位的,缓存项和缓存的相对关系 options.SizeLimit = 2; //缓存满了时候压缩20%的优先级较低的数据 options.CompactionPercentage = 0.2; //两秒钟查找一次过期项 options.ExpirationScanFrequency = TimeSpan.FromSeconds(2); });
private static readonly IMemoryCache _memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions
{
//缓存满了时候压缩20%的优先级较低的数据
CompactionPercentage = 0.05,
//1秒钟查找一次过期项
ExpirationScanFrequency = new TimeSpan(0, 0, 1),
}));
SemaphoreSlim是一个用于同步和限制并发访问的类,和它类似的还有Semaphore,只是SemaphoreSlim更加的轻量、高效、好用。今天说说它,以及如何使用,在什么时候去使用,使用它将会带来什么优势。
static SemaphoreSlim semaphore = new SemaphoreSlim(1); //控制访问线程的数量
semaphore.Wait();
semaphore.Release();