记录C#知识点(二)21-40

目录

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 property = new Dictionary();
            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 List = new List();
            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"));

记录C#知识点(二)21-40_第1张图片

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 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程序

记录C#知识点(二)21-40_第2张图片

2.增加app.manifest文件

记录C#知识点(二)21-40_第3张图片

记录C#知识点(二)21-40_第4张图片 

3.修改代码

记录C#知识点(二)21-40_第5张图片

 

4. 重新生成,查看生成目录

会看到一个带有盾牌的exe,就是已经增加了管理员权限的程序

 记录C#知识点(二)21-40_第6张图片

并且启动的时候,还会要求使用管理员运行vs软件

记录C#知识点(二)21-40_第7张图片 

 注意:当计算机登录用户已经是管理员的话,那么exe就不会出现盾牌。即使把生成带有盾牌的exe,复制过去,也不会带有盾牌。

28.wpf程序使用管理员运行

和winform差不多,只是项目的结构不一样

1.使用.net6创建一个wpf程序

记录C#知识点(二)21-40_第8张图片

2. 增加app.manifest文件

记录C#知识点(二)21-40_第9张图片

记录C#知识点(二)21-40_第10张图片 

3.修改代码

记录C#知识点(二)21-40_第11张图片

4. 重新生成,查看生成目录

会看到一个带有盾牌的exe,就是已经增加了管理员权限的程序

记录C#知识点(二)21-40_第12张图片

 

你可能感兴趣的:(记录(持续更新),c#,windows,开发语言)