探索 PyTorch 中的 torch.nn 模块(2)

目录

torch.nn模块详解

register_module_forward_pre_hook

主要特性和用途

警告

钩子签名

使用方法

返回值

示例代码

register_module_forward_hook 

主要特性和用途

警告

钩子签名

使用方法

参数

返回值

示例代码

register_module_backward_hook

主要用途

弃用警告

返回值

示例代码

register_module_full_backward_pre_hook

主要特性和用途

警告

钩子签名

使用方法

全局钩子执行顺序

返回值

示例代码

register_module_full_backward_hook

主要特性和用途

警告

钩子签名

使用方法

全局钩子执行顺序

返回值

示例代码

register_module_buffer_registration_hook

主要特性和用途

警告

钩子签名

使用方法

返回值

示例代码

register_module_module_registration_hook

主要特性和用途

警告

钩子签名

使用方法

返回值

示例代码

register_module_parameter_registration_hook

主要特性和用途

警告

钩子签名

使用方法

返回值

示例代码

总结


torch.nn模块详解

register_module_forward_pre_hook

torch.nn.modules.module.register_module_forward_pre_hook 是 PyTorch 中的一个函数,用于在所有模块的 forward() 方法调用之前注册一个全局的前向传播预处理钩子(hook)。这个函数主要用于调试和性能分析。

主要特性和用途

  • 调试和分析工具: 提供了一种在模型的前向传播过程中插入全局钩子的方法,常用于调试和性能分析。
  • 全局作用域: 注册的钩子将对所有 nn.Module 的实例生效。

警告

  • 添加全局状态: 该函数向 nn.module 模块添加全局状态,仅建议在调试或性能分析目的下使用。
  • 慎用: 错误使用可能导致不可预见的副作用,尤其在多模型或多线程环境中。

钩子签名

def hook(module, input) -> None or modified input
  • module: 当前调用前向传播的模块。
  • input: 传递给模块 forward() 方法的位置参数。关键字参数不会传递给钩子,只会在 forward() 中使用。

使用方法

  • 修改输入: 钩子可以修改传入的 input。用户可以返回一个元组或单个修改后的值。如果返回单个值,则自动将其封装成元组(除非该值已是元组)。
  • 钩子优先级: 该全局钩子优先于使用 register_forward_pre_hook 注册的特定模块钩子。

返回值

  • 函数返回一个 torch.utils.hooks.RemovableHandle,通过调用 handle.remove() 可以移除添加的钩子。

示例代码

import torch.nn as nndef custom_pre_hook(module, input):# 在这里可以添加自定义的处理逻辑print(f"Before forward of {module.__class__.__name__}: input size = {input[0].size()}")return input# 注册全局前向预处理钩子
handle = nn.modules.module.register_module_forward_pre_hook(custom_pre_hook)# 创建模型并进行前向传播测试
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
output = model(x)# 移除钩子
handle.remove()

在上述示例中,我们注册了一个自定义的全局钩子,用于在每个模块的前向传播之前打印输入数据的尺寸。这可以帮助我们理解数据如何在模型中流动。完成调试后,我们使用返回的句柄移除了钩子。 

register_module_forward_hook 

torch.nn.modules.module.register_module_forward_hook 是 PyTorch 中的一个函数,用于在所有模块的 forward() 方法计算输出后注册一个全局的前向传播钩子(hook)。这个函数主要用于调试和性能分析。

主要特性和用途

  • 调试和分析工具: 提供了一种在模型的前向传播过程中全局插入钩子的方法,常用于调试和性能分析。
  • 全局作用域: 注册的钩子将对所有 nn.Module 的实例生效。

警告

  • 添加全局状态: 该函数向 nn.module 模块添加全局状态,仅建议在调试或性能分析目的下使用。
  • 谨慎使用: 不当使用可能导致不可预测的副作用,特别是在多模型或多线程环境中。

钩子签名

def hook(module, input, output) -> None or modified output
  • module: 当前调用前向传播的模块。
  • input: 传递给模块 forward() 方法的位置参数。关键字参数不会传递给钩子,只会在 forward() 中使用。
  • output: forward() 方法计算的输出。

使用方法

  • 修改输出: 钩子可以修改 forward() 方法的输出。用户可以返回一个修改后的输出值。
  • 输入修改无效: 虽然钩子可以修改输入,但这不会影响 forward() 的执行,因为它是在 forward() 调用之后执行的。

参数

  • hook (Callable): 用户定义的钩子函数。
  • always_call (bool): 如果为 True,即使在调用模块时引发异常,钩子也会运行。默认值为 False。

返回值

  • 函数返回一个 torch.utils.hooks.RemovableHandle,通过调用 handle.remove() 可以移除添加的钩子。

示例代码

import torch.nn as nndef custom_forward_hook(module, input, output):# 在这里可以添加自定义的处理逻辑print(f"After forward of {module.__class__.__name__}: output size = {output.size()}")return output# 注册全局前向传播钩子
handle = nn.modules.module.register_module_forward_hook(custom_forward_hook)# 创建模型并进行前向传播测试
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
output = model(x)# 移除钩子
handle.remove()

 在上述示例中,我们注册了一个自定义的全局钩子,用于在每个模块的前向传播之后打印输出数据的尺寸。这可以帮助我们理解数据如何在模型中流动。完成调试后,我们使用返回的句柄移除了钩子。

register_module_backward_hook

torch.nn.modules.module.register_module_backward_hook 是 PyTorch 中的一个函数,用于在所有模块上注册一个全局的反向传播钩子(backward hook)。不过,重要的是要注意,这个函数已被弃用,并建议使用 torch.nn.modules.module.register_module_full_backward_hook 替代。在未来的版本中,register_module_backward_hook 的行为将会发生改变。

主要用途

  • 调试和分析: 用于在反向传播过程中,对所有模块执行一些通用操作,如打印梯度信息、检查反向传播的状态等。
  • 全局作用域: 该钩子会影响所有的 nn.Module 实例。

弃用警告

  • 已被弃用: register_module_backward_hook 已被标记为弃用,建议使用 register_module_full_backward_hook 替代。
  • 行为变化: 在未来的版本中,该函数的行为可能会发生变化。

返回值

  • 函数返回一个 torch.utils.hooks.RemovableHandle,可以用它来移除添加的钩子。

示例代码

虽然该函数已被弃用,但以下是一个使用 register_module_backward_hook 的示例代码。请注意,在实际应用中应考虑使用新的 register_module_full_backward_hook 方法。

import torch.nn as nndef custom_backward_hook(module, grad_input, grad_output):# 在这里可以添加自定义的处理逻辑print(f"Backward hook in {module.__class__.__name__}")# 可以检查或修改梯度return grad_input# 注册全局反向传播钩子
handle = nn.modules.module.register_module_backward_hook(custom_backward_hook)# 创建模型并测试
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
output = model(x)
output.backward(torch.randn(1, 5))# 移除钩子
handle.remove()

         在此示例中,我们注册了一个全局的反向传播钩子,用于在每个模块的反向传播过程中打印信息。完成调试后,我们使用返回的句柄移除了钩子。由于函数已被弃用,强烈建议在实际项目中使用 register_module_full_backward_hook 替代。

register_module_full_backward_pre_hook

torch.nn.modules.module.register_module_full_backward_pre_hook 是 PyTorch 中的一个函数,用于注册一个全局的反向传播前置钩子(backward pre-hook),这个钩子对所有模块都是通用的。该函数主要用于调试和性能分析。

主要特性和用途

  • 调试和分析工具: 提供了一种在所有模块的反向传播过程之前插入全局钩子的方法,常用于调试和性能分析。
  • 全局作用域: 注册的钩子将对所有 nn.Module 的实例生效。

警告

  • 添加全局状态: 该函数向 nn.module 模块添加全局状态,仅建议在调试或性能分析目的下使用。
  • 谨慎使用: 不当使用可能导致不可预见的副作用,特别是在多模型或多线程环境中。

钩子签名

def hook(module, grad_output) -> Tensor or None

 

  • module: 当前正在执行反向传播的模块。
  • grad_output: 反向传播过程中的梯度输出,是一个元组。

使用方法

  • 修改梯度输出: 钩子可以返回一个新的关于输出的梯度,这个新梯度将会在后续计算中使用,替代原有的 grad_output
  • 不要修改原参数: 钩子不应该修改其参数 grad_output

全局钩子执行顺序

  • 全局钩子将在使用 register_backward_pre_hook 注册的特定模块钩子之前被调用。

返回值

  • 函数返回一个 torch.utils.hooks.RemovableHandle,可以用它来移除添加的钩子。

示例代码

import torch.nn as nndef custom_backward_pre_hook(module, grad_output):# 在这里可以添加自定义的处理逻辑print(f"Backward pre-hook in {module.__class__.__name__}")# 可以返回一个新的梯度return grad_output# 注册全局反向传播前置钩子
handle = nn.modules.module.register_module_full_backward_pre_hook(custom_backward_pre_hook)# 创建模型并测试
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
output = model(x)
output.backward(torch.randn(1, 5))# 移除钩子
handle.remove()

 在此示例中,我们注册了一个全局的反向传播前置钩子,用于在每个模块的反向传播过程之前打印信息。完成调试后,我们使用返回的句柄移除了钩子。这种钩子对于理解和调试模型的反向传播过程非常有帮助。

register_module_full_backward_hook

torch.nn.modules.module.register_module_full_backward_hook 是 PyTorch 中的一个函数,用于在所有模块上注册一个全局的反向传播钩子(backward hook)。这个函数主要用于调试和性能分析。

主要特性和用途

  • 调试和分析工具: 提供了一种在所有模块的反向传播过程中全局插入钩子的方法,常用于调试和性能分析。
  • 全局作用域: 注册的钩子将对所有 nn.Module 的实例生效。

警告

  • 添加全局状态: 该函数向 nn.module 模块添加全局状态,仅建议在调试或性能分析目的下使用。
  • 谨慎使用: 不当使用可能导致不可预测的副作用,特别是在多模型或多线程环境中。

钩子签名

def hook(module, grad_input, grad_output) -> Tensor or None
  • module: 当前正在执行反向传播的模块。
  • grad_input: 反向传播过程中输入的梯度,是一个元组。
  • grad_output: 反向传播过程中输出的梯度,也是一个元组。

使用方法

  • 修改梯度输入: 钩子可以返回一个新的关于输入的梯度,这个新梯度将会在后续计算中使用,替代原有的 grad_input
  • 不要修改原参数: 钩子不应该修改其参数 grad_inputgrad_output

全局钩子执行顺序

  • 全局钩子将在使用 register_backward_hook 注册的特定模块钩子之前被调用。

返回值

  • 函数返回一个 torch.utils.hooks.RemovableHandle,可以用它来移除添加的钩子。

示例代码

import torch.nn as nndef custom_backward_hook(module, grad_input, grad_output):# 在这里可以添加自定义的处理逻辑print(f"Backward hook in {module.__class__.__name__}")# 可以返回一个新的梯度输入return grad_input# 注册全局反向传播钩子
handle = nn.modules.module.register_module_full_backward_hook(custom_backward_hook)# 创建模型并测试
model = nn.Linear(10, 5)
x = torch.randn(1, 10)
output = model(x)
output.backward(torch.randn(1, 5))# 移除钩子
handle.remove()

 在此示例中,我们注册了一个全局的反向传播钩子,用于在每个模块的反向传播过程中打印信息并可能返回一个新的梯度输入。完成调试后,我们使用返回的句柄移除了钩子。这种钩子对于理解和调试模型的反向传播过程非常有帮助。

register_module_buffer_registration_hook

torch.nn.modules.module.register_module_buffer_registration_hook 是 PyTorch 中的一个函数,它用于在所有模块中注册一个全局的缓冲区(buffer)注册钩子。这个钩子会在每次调用 register_buffer() 方法时被触发。它主要用于调试和修改模块中注册的缓冲区。

主要特性和用途

  • 缓冲区注册钩子: 这个钩子在模块的 register_buffer() 被调用时触发,可以用来修改或替换缓冲区。
  • 调试工具: 常用于调试目的,比如追踪缓冲区的注册或修改缓冲区的内容。

警告

  • 添加全局状态: 该函数向 nn.Module 模块添加全局状态,建议仅在调试或特定需要时使用。

钩子签名

def hook(module, name, buffer) -> None or new buffer
  • module: 调用 register_buffer() 的模块。
  • name: 注册的缓冲区名称。
  • buffer: 注册的缓冲区。

使用方法

  • 修改或替换缓冲区: 钩子可以修改输入的缓冲区或返回一个新的缓冲区。这可以用于调整缓冲区的内容或数据类型。

返回值

  • 返回一个 torch.utils.hooks.RemovableHandle 对象,可用于移除添加的钩子。

示例代码

import torch.nn as nndef custom_buffer_registration_hook(module, name, buffer):# 在这里可以添加自定义的处理逻辑print(f"Buffer registration hook in {module.__class__.__name__}, Buffer name: {name}")# 可以返回一个新的缓冲区或修改现有的缓冲区return buffer# 注册全局缓冲区注册钩子
handle = nn.modules.module.register_module_buffer_registration_hook(custom_buffer_registration_hook)# 创建模型并注册缓冲区
model = nn.Linear(10, 5)
model.register_buffer('custom_buffer', torch.randn(5))# 使用模型
x = torch.randn(1, 10)
output = model(x)# 移除钩子
handle.remove()

         在此示例中,我们注册了一个全局的缓冲区注册钩子,用于在模块注册缓冲区时打印信息。这种钩子可以帮助我们理解模块中缓冲区的注册情况或用于修改缓冲区内容。完成调试后,我们使用返回的句柄移除了钩子。

register_module_module_registration_hook

torch.nn.modules.module.register_module_module_registration_hook 是 PyTorch 中的一个函数,用于注册一个全局的模块注册钩子。这个钩子会在每次调用 register_module() 方法时被触发。它主要用于监控和修改模块注册过程。

主要特性和用途

  • 模块注册钩子: 当任何 nn.Module 的子模块通过 register_module() 方法注册时,这个钩子会被调用。
  • 监控和修改子模块: 钩子可以用来监控模块的注册过程或者动态修改正在注册的子模块。

警告

  • 添加全局状态: 该函数向 nn.Module 模块添加全局状态,因此建议仅在特定的场合(如调试)中使用。

钩子签名

def hook(module, name, submodule) -> None or new submodule
  • module: 正在注册子模块的父模块。
  • name: 被注册的子模块的名称。
  • submodule: 被注册的子模块本身。

使用方法

  • 修改或替换子模块: 钩子可以修改传入的子模块或返回一个新的子模块。这可以用于调整子模块的配置或替换子模块为不同的实现。

返回值

  • 返回一个 torch.utils.hooks.RemovableHandle 对象,可以用于移除添加的钩子。

示例代码

 

import torch.nn as nndef custom_module_registration_hook(module, name, submodule):# 在这里可以添加自定义的处理逻辑print(f"Module registration hook in {module.__class__.__name__}, Submodule name: {name}")# 可以返回一个新的子模块或修改现有的子模块return submodule# 注册全局模块注册钩子
handle = nn.modules.module.register_module_module_registration_hook(custom_module_registration_hook)# 创建模型并注册子模块
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.linear = nn.Linear(10, 5)model = MyModel()# 使用模型
x = torch.randn(1, 10)
output = model(x)# 移除钩子
handle.remove()

在此示例中,我们注册了一个全局的模块注册钩子,用于在子模块注册时打印信息。这种钩子可以帮助我们理解模块注册的流程或用于修改子模块。完成调试后,我们使用返回的句柄移除了钩子。

register_module_parameter_registration_hook

torch.nn.modules.module.register_module_parameter_registration_hook 是 PyTorch 中的一个函数,它用于在所有模块中注册一个全局的参数(Parameter)注册钩子。这个钩子会在每次调用 register_parameter() 方法时被触发。它主要用于监控和修改模块中参数的注册过程。

主要特性和用途

  • 参数注册钩子: 当任何 nn.Module 的参数通过 register_parameter() 方法注册时,这个钩子会被调用。
  • 监控和修改参数: 钩子可以用来监控参数的注册过程或动态修改正在注册的参数。

警告

  • 添加全局状态: 该函数向 nn.Module 模块添加全局状态,因此建议仅在特定的场合(如调试)中使用。

钩子签名

def hook(module, name, param) -> None or new parameter

 

  • module: 正在注册参数的模块。
  • name: 被注册的参数的名称。
  • param: 被注册的参数本身。

使用方法

  • 修改或替换参数: 钩子可以修改传入的参数或返回一个新的参数。这可以用于调整参数的配置或值。

返回值

  • 返回一个 torch.utils.hooks.RemovableHandle 对象,可以用于移除添加的钩子。

示例代码

import torch.nn as nndef custom_parameter_registration_hook(module, name, param):# 在这里可以添加自定义的处理逻辑print(f"Parameter registration hook in {module.__class__.__name__}, Parameter name: {name}")# 可以返回一个新的参数或修改现有的参数return param# 注册全局参数注册钩子
handle = nn.modules.module.register_module_parameter_registration_hook(custom_parameter_registration_hook)# 创建模型并注册参数
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.register_parameter('custom_param', nn.Parameter(torch.randn(5)))model = MyModel()# 使用模型
x = torch.randn(1, 10)
output = model(x)# 移除钩子
handle.remove()

 在此示例中,我们注册了一个全局的参数注册钩子,用于在参数注册时打印信息。这种钩子可以帮助我们理解参数注册的流程或用于修改参数。完成调试后,我们使用返回的句柄移除了钩子。

总结

        在 PyTorch 的 torch.nn 模块中,提供了多种全局钩子(hook)注册函数,这些函数使得开发者能够在模型的关键生命周期阶段插入自定义的逻辑或监控代码。这些钩子广泛应用于模型的调试、性能分析以及对模型行为的深入理解。后续我这边会继续更新pytorch相关函数的其他内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive多分隔符外表支持

在hive 外表关联文本的时候 有时会遇到不是一个长度的分割符比如"~" 这种。这个时候使用shell命令多处理一步处理成单分隔符也可以,但是会有出错的风险。我们可以通过hive中指定的序列类来完成多分隔符的识别。 CREATE EXTERNAL TABLE text_mid1( id STRI…

使用Triton部署ONNX模型

介绍 适用于各种 AI 工作负载的推理:借助 NVIDIA Triton™,在任何处理器(GPU、CPU 或其他)上,对使用基于任何框架的,经过训练的机器学习模型或深度学习模型,进行推理部署。Triton 是 NVIDIA AI…

【C#】知识点实践序列之Lock简单解决并发引起数据重复问题

欢迎来到《小5讲堂之知识点实践序列》文章,大家好,我是全栈小5。 这是2023年第3篇文章,此篇文章是C#知识点实践序列文章,博主能力有限,理解水平有限,若有不对之处望指正! 本篇在Lock锁定代码块基…

《数据库开发实践》之触发器【知识点罗列+例题演练】

一、什么是触发器? 1.概念: 简单来说触发器就是一种特殊的存储过程,在数据库服务器触发事件的时候会自动执行其SQL语句集。 2.构成四要素: (1)名称:要符合标识符命名规则 (2&am…

idea中切换JDK8、JDK11、JDK17

有时候,我们可能需要在不同的Java版本中去测试或者查看源码,idea可以让我们修改Java的版本。 前提:你必须下载安装好对应的Java版本,可参考文章【windows下切换JDK8、JDK11、JDK17】(https://blog.csdn.net/xijinno1/a…

口袋参谋:遇到差评怎么办?用好这3招方法,帮你全面规避差评!

​常在江湖飘,哪有不挨刀! 至少99.999%的商家,都被差评折磨过! 一个差评的威力,100%能让转化跌落到谷底! 那如何处理差评?规避差评呢? 敲重点: 小本本记好&#xff…

JVM工作原理与实战(三):字节码文件的组成

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、基础信息 1.Magic魔数 2.主副版本号 3.其他信息 二、常量池 1.案例解析 三、方法 1.方法介绍 2.案例解析 四、字段 五、属性 总结 前言 JVM作为Java程序的运行环境&…

第 6 章 统计量及其抽样分布

统计量 卡方分布,t分布,f分布 样本均值的抽样分布 中心极限定理 样本比例的的抽样分布 两个均值之差的抽样分布 样本方差的分布(重要) 两个样本方差比的分布 注意理解下面这个图里面的定义(比较重要&#xff09…

2023年度十大科技名词发布:大语言模型、脑机接口在列

源自:IT之家 “人工智能技术与咨询” 发布 IT之家 12 月 26 日消息,据光明日报,全国科学技术名词审定委员会事务中心联合国家语言资源监测与研究平面媒体中心、蜜度微热点研究院、万方数据、百度百科、百度指数、《中国科技术语》杂志社等…

Java面向对象封装--学习笔记

面向对象三大特征:封装、继承、多态 什麽是封装? 就是用类设计对象处理某一个事务的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去 用通俗一点的话来说就是设计对象时应该把要使用到…

服务雪崩简单的介绍

定义 服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。如下图所示: 上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的…

浙大链协2023年终总结

2 0 2 4 元旦 快乐 龙腾虎跃 01 引言 俗话说:"币圈一天,人间十年",数字货币一天的涨跌可能抵上其他资产价格一年的波动幅度。而经历过漫长的熊市后,铭文的火爆十分生动地表述了这一口号...... 2023年,浙大链…

计量校准方案分享No.13——盐雾试验箱校准方案

测量单元:盐雾试验箱,工作室容积:0~1 一 依据文件 CNAS CL01-G002-2021 《测量结果的计量溯源性要求》现行有效 RB/T 034-2020 《测量设备校准周期的确定和调整方法指南》现行有效 CNAS TRL-004-2017 《 CNAS技术报告 测量设备校准周期的确定和调整方法指南》现行有效 JJF…

Ubuntu使用root用户远程登录

修改配置文件 在Ubuntu上,可以通过SSH(Secure Shell)来进行远程登录。默认情况下,Ubuntu的root用户是被禁止直接远程登录的,这样可以提高系统安全性。但如果确实需要使用root用户进行远程登录,可以按照以下…

针对工行的LockBit勒索软件攻击表明了全球金融系统对网络攻击的脆弱性

内容概要: 11月8日,工行一家美国子公司被勒索软件入侵导致美国国债交易业务瘫痪,暴露了全球金融系统易受网络攻击的脆弱性。LockBit勒索软件集团声称对工行的攻击负责。工行是世界上资产规模最大的银行,管理着5.7万亿美元。这一网…

前端学习笔记 3:Vue 工程

前端学习笔记 3:Vue 工程 上一篇文章介绍了如何在单一 Html 页面中使用 Vue,本文介绍如何从头开始用 Vue 构建一个前端工程项目。 环境准备 Vue 框架代码的创建依赖于 Node.js,因此需要先安装 Node.js。 创建和启动 创建 通过以下命令可…

Spring通信传参的方法

Spring通信传参的方法 目录概述需求: 设计思路实现思路分析1.简单参数传递2.复合参数3.动态参数 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better resul…

HarmonyOS UI框架简介

HarmonyOS UI框架介绍 HarmonyOSUI框架是一个用于构建跨设备应用的开发框架,它属于HarmonyOS系统架构的上层框架。该框架通过提供一系列的开发模型、声明式UI范式、系统API等,帮助开发者更高效地构建用户界面。 在HarmonyOSUI框架中,开发语…

C#中字母与ASCⅡ码的转换

目录 一、关于ASCⅡ及与字符互转 1.主要用到Encoding对象的GetBytes方法 2.Char显式转换为数值类型得到ASCⅡ 二、实例 三、生成效果 四、程序中的一些知识点 1.IsLetterOrDigit() 2.GetBytes() 3.TryParse(string, out int) 一、关于ASCⅡ及与字符互转 ASCⅡ(Americ…

.net8时代,微软.net开发策略,F#不就是VB语言吗?

看了一下F#代码几乎和VB差不多,重复造轮子微软却玩的很开心。 可是真正的VB6,vb.net却抛弃了 .网络管理语言策略。NET微软学习https://learn.microsoft.com/en-us/dotnet/fundamentals/languages 微软提供三种语言。网络平台-C#,F#和视觉基础.在本文中,您将了解我…