C# 带有值类型变量的ref和out

C# 带有值类型变量的ref和out,c#,methods,out,ref,C#,Methods,Out,Ref,表示作为输出传递的参数必须在函数内指定一个值。网站上的示例: class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } } 根据我的理解,当声明int“value”时,它已经被分

表示作为输出传递的参数必须在函数内指定一个值。网站上的示例:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
       // value is now 44
    }
 }
根据我的理解,当声明int“value”时,它已经被分配了一个默认值0(因为int是一个值类型,不能为null)。那么为什么“Method”必须修改它的值呢

同样,如果使用“ref”而不是out,是否需要初始化“value”


有这样的问题,但没有人想把2和2放在一起。

默认情况下,int没有赋值,即使有一个默认值……试试这个:

Console.WriteLine(default(int)); // output = '0'
int foo;
Console.WriteLine(foo); // compile error - Use of unassigned local variable

out参数的契约是保证该方法为其赋值。ref参数的契约没有这样的保证。

默认情况下,int没有赋值,即使有默认值……请尝试以下操作:

Console.WriteLine(default(int)); // output = '0'
int foo;
Console.WriteLine(foo); // compile error - Use of unassigned local variable
out参数的契约是保证该方法为其赋值。ref参数的契约没有这样的保证。

您必须为变量赋值。但是,您在文章中提到的
out
参数的概念具有更多的语义含义

如果将
参数传递出去
您希望调用的函数必须分配它<代码>C#编译器简单地将“优秀程序员”的技能用于编译时间控制,以获得更好的代码风格

您必须为变量赋值。但是,您在文章中提到的
out
参数的概念具有更多的语义含义

如果将
参数传递出去
您希望调用的函数必须分配它<代码>C#编译器简单地将“优秀程序员”的技能用于编译时间控制,以获得更好的代码风格

根据我的理解,当int“value”被声明为 已指定默认值0(因为int是值类型,并且 不能为空。)

不,那不对

局部变量在创建时没有赋值。局部变量的空间是通过移动堆栈指针在堆栈上为它们腾出空间来创建的。该内存区域未被清除,它将包含碰巧存在的任何值

编译器强制您在使用变量之前为变量赋值,这样它最初包含的“垃圾”值就永远不会被使用

类似地,如果使用“ref”而不是out,是否会有 是否需要初始化“值”

这个值不需要在方法中设置,因为它已经有了一个值。用于调用方法的变量需要初始化,但:

static void Method(ref int i) {
    // doesn't need to set the value
}

static void Main() {
    int value;
    value = 42; // needs to be initialised before the call
    Method(ref value);
   // value is still 42
}
根据我的理解,当int“value”被声明为 已指定默认值0(因为int是值类型,并且 不能为空。)

不,那不对

局部变量在创建时没有赋值。局部变量的空间是通过移动堆栈指针在堆栈上为它们腾出空间来创建的。该内存区域未被清除,它将包含碰巧存在的任何值

编译器强制您在使用变量之前为变量赋值,这样它最初包含的“垃圾”值就永远不会被使用

类似地,如果使用“ref”而不是out,是否会有 是否需要初始化“值”

这个值不需要在方法中设置,因为它已经有了一个值。用于调用方法的变量需要初始化,但:

static void Method(ref int i) {
    // doesn't need to set the value
}

static void Main() {
    int value;
    value = 42; // needs to be initialised before the call
    Method(ref value);
   // value is still 42
}

有时,您需要从方法返回多个值,因此在这种情况下,您可以通过ref和out参数返回这些额外的值。这些方法的一个很好的参考是.NET framework中的“TryParse”方法,例如“Int32.TryParse方法”


您可以在MSDN的上述链接中找到更多信息。

有时,从方法中,您需要返回多个值,因此在这种情况下,您可以通过ref和out参数返回这些额外值。这些方法的一个很好的参考是.NET framework中的“TryParse”方法,例如“Int32.TryParse方法”


您可以在MSDN的上述链接中找到更多信息。

我认为没有任何“垃圾”价值
int
将被分配一个默认值
0
,当一个变量仅被声明时,它将被取消分配。在.NET C++、C++中没有垃圾值的概念。<代码> OUT/CODE>只指定该方法将修改参数的值。即使那个参数被分配了一些“非垃圾”值,我也不认为有任何“垃圾”值
int
将被分配一个默认值
0
,当一个变量仅被声明时,它将被取消分配。在.NET C++、C++中没有垃圾值的概念。<代码> OUT/CODE>只指定该方法将修改参数的值。即使该参数被分配了一些“非垃圾”值。