c# - 为什么“out”参数作为语言结构存在于 C# 中?
问题描述
问题
为什么“out”参数作为语言结构存在于 C# 中?
关于问题的详细说明
为什么它首先存在?难道没有更好的语言特性来获得与“out”参数相同的效果吗?
让值类型表现得像引用类型不是很奇怪吗?
没有更好的方法从一个方法返回多个值吗?
这是一个历史性的事情吗,这意味着对于 C# 的第一个版本,没有办法实现使用 out 参数可以实现的东西,但现在有更新的功能,它只是保留在语言中以实现向后兼容性?
我不是在问什么
- 我不是在问它做什么
- 我不是问它是如何使用的
- 我不是在问“ref”和“out”之间的区别是什么
- 我读到应该避免使用它并选择其他构造
在阅读类似问题时,我没有发现任何重复项。
预期答案格式
我很想听到类似“看,这是一个只能使用“out”参数语言结构来解决的问题,这是一个代码示例……”。
或者,“看,这曾经是解决以下问题的唯一方法......代码示例......,但由于 C# 版本......更好的解决方法是这样......代码示例......” .
请不要发表意见。
解决方案
C# 编译器执行明确的赋值检查。这要求它准确知道何时分配变量。通常不难弄清楚,一项任务很容易看到。
但是有一个极端情况是当一个变量通过引用传递给另一个方法时。该方法是否要求在调用之前分配该变量,然后对其进行修改,还是只分配它?编译器通常无法知道,该方法可能存在于另一个程序集中,而方法主体不可用。例如,对于任何 .NET Framework 程序集都是如此。
所以你必须明确它,ref
当方法需要在调用之前分配参数时使用,out
当方法只分配它时。顺便说一句,很棒的功能,它消除了整个非常常见的错误。
关于此问题的其他不正确答案的注释。数据流在 pinvoke 中也起着重要作用,pinvoke 编组器需要知道是否转换了非托管函数返回的任何数据。它不关注out vs ref 关键字,只关注[In]
and[Out]
属性。更多关于这个 Q+A中的细节。
推荐阅读
- arrays - 使用 Angular 在对象 [{...submenu:[{..}],[{..}],...}] 内的数组中过滤子菜单对象
- python - “client.wait_for”功能仅适用于作者
- clickhouse - ClickHouse ALTER TABLE DELETE 异常代码 241
- c++ - 你能在 C++ 的一行中初始化一个指针和相应的对象吗?
- c++ - C++ 在派生类对象上重用非虚拟基类运算符
- reactjs - 如何在另一个函数中获得结果 AXIOS?
- javascript - 如何设置全局 chart.js 工具提示标签回调
- android - 如果应用程序关闭,我如何显示通知?
- c# - Roslyn 不优化多个增量是否有原因?
- sql-server - 如果 else 阻塞,则在 ms sql 查询中选择临时表