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

这篇具有很好参考价值的文章主要介绍了记录C#知识点(二)21-40。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

21.性能优化

22.动态dynamic使用

23.中文乱码

24.启动项目之前,执行文件

25.深拷贝-反射实现

26.丢弃运算符 _

27.winform程序使用管理员运行

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

29.Windows7上运行.net6程序报错

30.字符串转化字节数组,字节数组换成字符串

31.共享内存

32.Lazy用法 

33.性能优化Freezable

34.DataTable中Select的问题

35.使用Dumpify可视化数据结构

36.winform和wpf版本自动生成控制

37.C#递归,寻找子节点


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"));

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

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

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

2.增加app.manifest文件

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

3.修改代码

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

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

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

 记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

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

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

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

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

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

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

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

2. 增加app.manifest文件

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

3.修改代码

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

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

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

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

29.Windows7上运行.net6程序报错

报错KERNELBASE.dll问题

此问题是Windows7缺少了系统更新的文件,使用腾讯电脑管家,进行更新即可,或者其他系统更新软件。

30.字符串转化字节数组,字节数组换成字符串

    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        Encoding FromEcoding = Encoding.GetEncoding("UTF-8");
        Encoding ToEcoding = Encoding.GetEncoding("gb2312");
        byte[] FromBytes = FromEcoding.GetBytes("你好");
        byte[] Tobytes = Encoding.Convert(FromEcoding, ToEcoding, FromBytes);

        Encoding FromEcoding1 = Encoding.GetEncoding("gb2312");
        Encoding ToEcoding1 = Encoding.GetEncoding("UTF-8");
        byte[] Tobytes1 = Encoding.Convert(FromEcoding, ToEcoding, Tobytes);
        string s = ToEcoding.GetString(Tobytes);

31.共享内存

MemoryMappedFile,进程之前共享一个文件。

            string fileName = @"D:\1\1.txt";

            using (var mmFile = MemoryMappedFile.CreateFromFile(fileName, FileMode.OpenOrCreate, "fileHandle", 1024 * 1024))
            {
                string valueToWrite = "123456789";
                var myAccessor = mmFile.CreateViewAccessor();
                myAccessor.WriteArray<byte>(0, Encoding.ASCII.GetBytes(valueToWrite), 0, valueToWrite.Length);

                var readout = new byte[valueToWrite.Length];
                myAccessor.ReadArray<byte>(0, readout, 0, readout.Length);
                var finalValue = Encoding.ASCII.GetString(readout);
                MessageBox.Show(finalValue);
            }

32.Lazy用法 

Lazy是一种延迟加载技术,就是比较懒,只有在需要的时候,才会去执行第一次,但是只要执行第一次以后,就不需要再次执行了,提高了性能。

        // 创建一个Lazy实例,传入一个委托,该委托将在第一次访问时执行      //顺序2,只调用一次,以后不要调用了
        Lazy<int> lazy = new Lazy<int>(() =>
        {
            Console.WriteLine("计算结果...");
            return 42; // 模拟耗时操作
        });
        private void button_Click(object sender, RoutedEventArgs e)
        {
            // 访问Lazy实例的值,这将触发委托的执行
            Console.WriteLine("第一次访问: " + lazy.Value);      //顺序1
            // 再次访问Lazy实例的值,这次将直接返回之前计算的结果,而不再执行委托      //顺序3
            Console.WriteLine("第二次访问: " + lazy.Value);
        }

33.性能优化Freezable

类中继承Freezable,可以让类进行冻结,从而提高性能,冻结后,不可以修改类的属性值,只能读取。(非常底层的优化,有些作用,但是意义不是很大)

34.DataTable中Select的问题

当使用Select选择字段的值的时候,如果数据没有更新,会出现少一条数据的情况。

比如,isCheck=‘1’,明明选择了4条,但是在使用Select的时候,只有3条数据

此时就要在更改数据的地方,加上如下代码。

 dt.AcceptChanges(); 

35.使用Dumpify可视化数据结构

1.安装

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

2.代码使用

  var a = new
            {
                ID = "1",
                Name = "故里2130",
                Description = "故里2130"
            };
            a.Dump();

3.效果

多层数据嵌套也是可以的,帮助我们可视化复杂的数据结构

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

36.winform和wpf版本自动生成控制

可在.csproj文件中输入下面的代码

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
    <Platforms>AnyCPU;x64</Platforms>
    <Version>5.1.$([System.DateTime]::UtcNow.ToString("yy")).$([System.DateTime]::UtcNow.ToString("MM"))</Version>
    <FileVersion>6.1.$([System.DateTime]::Now.ToString("yy")).$([System.DateTime]::Now.ToString("MM"))</FileVersion>
  </PropertyGroup>
</Project>

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言 可以换成net4.8版本

效果 

记录C#知识点(二)21-40,记录(持续更新),c#,windows,开发语言

如果后缀出现字母的情况下,增加

<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>

37.C#递归,寻找子节点

using System;

public class Node
{
    public int Value { get; set; }
    public Node Parent { get; set; }
    public List<Node> Children { get; set; }

    public Node(int value)
    {
        Value = value;
        Children = new List<Node>();
    }
}

public class Program
{
    public static void Main()
    {
        // 创建父子嵌套类的实例
        Node root = new Node(1);
        Node child1 = new Node(2);
        Node child2 = new Node(3);
        Node child11 = new Node(11);
        Node child12 = new Node(12);
        Node child13 = new Node(13);
        Node child21 = new Node(21);
        Node child22 = new Node(22);
        Node child23 = new Node(23);

        root.Children.Add(child1);
        child1.Children.Add(child11);
        child1.Children.Add(child12);
        child1.Children.Add(child13);
        root.Children.Add(child2);
        child2.Children.Add(child21);
        child2.Children.Add(child22);
        child2.Children.Add(child23);

        child1.Parent = root;
        child2.Parent = root;

        // 使用递归搜索给定值
        int targetValue = 22;
        Node result = FindValueRecursively(root, targetValue);

        if (result != null)
        {
            Console.WriteLine("找到了值为 " + targetValue + " 的节点");
        }
        else
        {
            Console.WriteLine("未找到值为 " + targetValue + " 的节点");
        }
    }

    public static Node FindValueRecursively(Node currentNode, int targetValue)
    {
        if (currentNode.Value == targetValue)
        {
            return currentNode;
        }

        foreach (Node child in currentNode.Children)
        {
            Node foundNode = FindValueRecursively(child, targetValue);
            if (foundNode != null)
            {
                return foundNode;
            }
        }

        return null; // 没有找到目标值
    }
}

来源:记录C#知识点(二)21-40_故里2130的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-571784.html

到了这里,关于记录C#知识点(二)21-40的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pyqt5控件自适应窗口知识点汇总(超详细讲解,持续更新中…)

    本文涉及:Windows操作系统,Python,PyQt5,Qt Designer,PyCharm 目录 一、自适应原理  二、基础布局示例 三、高级布局示例:布局嵌套布局 四、其它特殊控件自适应补充 1. tableWidget  2. 未完待续… 五、结语         自适应其实很简单,只要搞懂原理,你就能随心所欲地去布置你

    2024年02月02日
    浏览(47)
  • 持续不断更新中... 自己整理的一些前端知识点以及前端面试题,包括vue2,vue3,js,ts,css,微信小程序等

    答: 在普通的前端项目工程中,在script标签中增加setup即可使用api 使用setup()钩子函数 答: 不要在计算属性中进行异步请求或者更改DOM 不要直接修改computed的值 区别: 计算属性值基于其响应式依赖被缓存,意思就是只要他之前的依赖不发生变化,那么调用他只会返回之前缓

    2024年02月11日
    浏览(63)
  • 关于“Python”的核心知识点整理大全40

    目录 alien_invasion.py game_functions.py 14.3.3 在外星人被消灭时更新得分 settings.py game_functions.py game_functions.py alien_invasion.py 14.3.4 将消灭的每个外星人的点数都计入得分 game_functions.py 14.3.5 提高点数 settings.py settings.py 注意 14.3.6 将得分圆整 scoreboard.py 注意 14.3.7 最高得分 game_stats.py s

    2024年02月03日
    浏览(39)
  • 关于“Python”的核心知识点整理大全21

    在Python 2.7中,继承语法稍有不同,ElectricCar类的定义类似于下面这样: 函数super()需要两个实参:子类名和对象self。为帮助Python将父类和子类关联起来,这些 实参必不可少。另外,在Python 2.7中使用继承时,务必在定义父类时在括号内指定object。 9.3.3 给子类定义属性和方法

    2024年01月16日
    浏览(41)
  • ad+硬件每日学习十个知识点(10)23.7.21

    doc:放文档 par:quartus Ⅱ的工程文件 rtl:设计输入文件,也就是verilog代码 sim:仿真文件 答:在file里选择新建工程向导 内核电压为1.2V,逻辑单元10320,用户可用引脚数等信息。 这是第三方的EDA工具,不使用直接next。 结束 答:可以双击这里进行修改。 答:在file里选择new,

    2024年02月15日
    浏览(53)
  • 飞天使-k8s知识点21-kubernetes实操6-daemonset

    daemonset service endpoint pod 之间的关系 service 基于Service访问外部服务

    2024年02月22日
    浏览(48)
  • Zookeeper 复习知识点(更新中)

    Zookeeper 是开源的,是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接收观察者的注册,一旦这些数据发生变化,Zookeeper 负责通知已经注册的观察者。Zookeeper 相当于文件系统 + 通知机制。 1.1 Zookeeper 特点 集群架构 :Zookeeper 通常由

    2024年01月18日
    浏览(37)
  • 项目知识点记录

    Java程序使用 JDBC 接口访问关系数据库的时候,需要以下几步: 创建全局 DataSource 实例,表示数据库连接池; 在需要读写数据库的方法内部,按如下步骤访问数据库: 从全局 DataSource 实例获取 Connection 实例; 通过 Connection 实例创建 PreparedStatement 实例; 执行 SQL 语句,如果是

    2024年02月13日
    浏览(36)
  • C#知识点、常见面试题

    https://github.com/JackYan666/CSharpCode/blob/main/CSharpCode.cs 1.For循环删除集合元素可能漏删:从后面往前删除 2.Foreach不能直接修改集合元素:用递归的思想,删除完了的集合重新遍历 3.闭包问题:for循环存在闭包,可以通过使用临时变量解决;Task存在闭包问题可以通过wait解决,可以通

    2024年02月10日
    浏览(34)
  • WPF复习知识点记录

    由于近几年主要在做Web项目,客户端的项目主要是以维护为主,感觉对于基础知识的掌握没有那么牢靠,趁着这个周末重新复习下WPF的相关知识。 文章内容主要来自大佬刘铁锰老师的经典著作《深入浅出WPF》。 因为是复习,所以知识内容不会一一记录,如有需要了解更多可

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包