通过引用传递值类型而不在c#中初始化[重复]

Posted

技术标签:

【中文标题】通过引用传递值类型而不在c#中初始化[重复]【英文标题】:Passing value type by reference without initializing in c# [duplicate] 【发布时间】:2021-08-21 07:53:28 【问题描述】:

我有一个关于在 c# 中通过引用传递值类型的非常基本的问题。 如果变量未初始化,为什么 c# 不允许我们通过引用传递变量?如果我们这样做会有什么问题?

让我们以下面的代码为例

public static void main()

   int i;
   SomeMethod(ref i);


public static void SomeMethod(ref int i)

   i = 10;


why cant i execute this method? why compiler is stopping me from doing this? what issue will be faced if we pass a unassigned variable as reference? 

【问题讨论】:

如果你想要这种语义,请将 ref 更改为 out @sweeper 我想了解不允许我们将未分配的变量作为参考传递的逻辑。这与我如何更改代码以使其正常工作无关。 您是否希望能够编写int i; Console.WriteLine(i); - 即读取未分配的局部变量?如果不是,您为什么希望仅仅通过添加一个间接级别就能够完成完全相同(危险)的事情? 请注意,这与 int 是值类型无关。对于任何其他类型,您都会得到完全相同的行为 - 变量 必须 在用作 ref 参数之前明确分配。 what issue will be faced if we pass a unassigned variable as reference? 它不会编译。正如你所发现的。 ;) want to understand the logic behind not allowing us to pass a unassigned variable as ref. 因为编写编译器的人正试图保护你免于被自己的脚射伤。如果他们允许,他们需要记录会发生什么等等,并在它没有按照人们期望的方式运行时忍受不可避免的错误报告。如果他们不允许允许 - 好吧,他们可能会保护一些脚并减少错误报告。 【参考方案1】:

如果变量未初始化,则改用out。检查ref 变量是否需要初始化,可以帮助您避免编程错误

【讨论】:

【参考方案2】:

当您使用ref 传递变量时,您是在断言该变量已经初始化(即使对于引用类型该值为null)。将其声明为局部变量然后尝试在相同的方法中使用它而不初始化它没有什么不同。这就是为什么您不能传递未初始化的变量的原因。还有一个问题是,即使这是可能的,您也无法判断它是否已在代码中初始化。

至于为什么传递它不会简单地将其初始化为default(type),我不能说。我的感觉是它没有意义,而且你应该在你编写的代码中明确,所以事先初始化变量是有意义的。

所以你可以使用未初始化的变量,out 存在。因此,要修复您的代码,请将ref 替换为out。现在是SomeMethod 负责初始化i

public static void main()

   int i;
   SomeMethod(out i);


public static void SomeMethod(out int i)

   i = 10;

进一步阅读:

What's the difference between the 'ref' and 'out' keywords? Ref keyword docs Out keyword docs

【讨论】:

【参考方案3】:

用完:

public static void main()

   int i;
   SomeMethod(out i);


public static void SomeMethod(out int i)

   i = 10;

【讨论】:

我想了解为什么它不允许。它只是一个代码示例,我知道 out 和 ref 是如何工作的。但我想了解 ref 的内部结构,我的问题是为什么,为什么不允许。 why, why is it not allowed. 因为编译器的作者是这么认为的。查看重复的链接。正如它所说的那样Because experience has shown that forgetting to assign a value to a local is probably a bug.

以上是关于通过引用传递值类型而不在c#中初始化[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过引用或值传递的数组[重复]

值传递和引用传递(不是引用类型的传递)的区别

对象作为参数传递给另一个类,通过值还是引用?

java引用传递,值传递

在 C# 中通过引用或值传递对象

值传递vs引用传递