目录
21.性能优化
22.动态dynamic使用
23.中文乱码
24.启动项目之前,执行文件
25.深拷贝-反射实现
26.丢弃运算符 _
27.winform程序使用管理员运行
28.wpf程序使用管理员运行
21.性能优化
1.检查空字符串:使用string.Empty
2.更改类型转换:使用as
3.字符串比较法:Equals("abc")
4.for循环:使用--i比++i效率高
5.继承,能少用就少用,代码简洁了,但是效率低
22.动态dynamic使用
先定义
public class DynamicInputParams : DynamicObject
{
Dictionary<string, object> property = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name;
return property.TryGetValue(name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
property[binder.Name] = value;
return true;
}
}
使用
dynamic P = new DynamicInputParams();
P.Name = "张三";
P.Age = 22;
P.Sex = "女";
P.a = "a";
Console.WriteLine(P.Name);
//也可以添加到List集合
List<dynamic> List = new List<dynamic>();
List.Add(P);
foreach (var item in List)
{
Console.WriteLine(item.Name);
}
或者
dynamic retObject;
retObject = new { retcode = "0", retmsg = "成功", data = 1 };
23.中文乱码
AppContext.SetSwitch("Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering", false);
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string[] strAll = await System.IO.File.ReadAllLinesAsync(filePath, Encoding.GetEncoding("gbk"));
24.启动项目之前,执行文件
1.建立1.bat,demo是要关闭的进程
taskkill /IM demo.exe /F
2.生成前事件命令行,注意目录的路径
powershell.exe -Command "Start-Process '$(SolutionDir)\1.bat' -Verb RunAs"
25.深拷贝-反射实现
还可以使用别的方式实现
// 利用反射实现深拷贝
#region MyRegion
public static T DeepCopyWithReflection<T>(T obj)
{
Type type = obj.GetType();
// 如果是字符串或值类型则直接返回
if (obj is string || type.IsValueType) return obj;
// 如果是数组
if (type.IsArray)
{
Type elementType = Type.GetType(type.FullName.Replace("[]", string.Empty));
var array = obj as Array;
Array copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
{
copied.SetValue(DeepCopyWithReflection(array.GetValue(i)), i);
}
return (T)Convert.ChangeType(copied, obj.GetType());
}
object retval = Activator.CreateInstance(obj.GetType());
PropertyInfo[] properties = obj.GetType().GetProperties(
BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Instance | BindingFlags.Static);
foreach (var property in properties)
{
var propertyValue = property.GetValue(obj, null);
if (propertyValue == null)
continue;
property.SetValue(retval, DeepCopyWithReflection(propertyValue), null);
}
return (T)retval;
}
#endregion
26.丢弃运算符 _
使用_,编译器不会出现提示警告了
_ = Task.Run(() =>
{
});
27.winform程序使用管理员运行
1.首先建立一个winform程序
2.增加app.manifest文件
3.修改代码
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
4. 重新生成,查看生成目录
会看到一个带有盾牌的exe,就是已经增加了管理员权限的程序
并且启动的时候,还会要求使用管理员运行vs软件
注意:当计算机登录用户已经是管理员的话,那么exe就不会出现盾牌。即使把生成带有盾牌的exe,复制过去,也不会带有盾牌。
28.wpf程序使用管理员运行
和winform差不多,只是项目的结构不一样
1.使用.net6创建一个wpf程序
2. 增加app.manifest文件
3.修改代码
4. 重新生成,查看生成目录
会看到一个带有盾牌的exe,就是已经增加了管理员权限的程序