.net变量值可能在方法调用上改变

本文关键字:调用 改变 方法 变量值 net | 更新日期: 2023-09-27 18:05:46

大家好
我想知道如果我有bool x = true;,我调用一个方法之后,可能会改变x值。如果方法是void,这个改变会适用吗?不返回结果。
示例:

bool x = true;
string x = "";
Change_value(x);
if (!(x))
   x = "Ok";
当我调用我的方法时,

x值会改变吗?或者我需要做x = change_value(x)

.net变量值可能在方法调用上改变

这取决于您传递给方法的变量的类型。在您的示例中,no.

值类型不会在调用作用域中看到反映的更改,而引用值上的属性会。

这个答案很好地解释了这个概念

注意,您可以使用ref关键字来更新值类型,就像更新引用类型一样。

可以更改引用值的成员,但不能重新赋值他们。

namespace ConsoleApplication1
{
    public class TestObj
    {
        public string Val { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var testObj = new TestObj { Val = "Initial instance" };
            Console.WriteLine(testObj.Val);
            AssignNewInstance(testObj);
            Console.WriteLine(testObj.Val);
            // Prints: 
            // 'Initial instance'
            // 'Changed in AssignNewInstance'
            // 'Initial instance'
        }
        public static void AssignNewInstance(TestObj testObj)
        {
            testObj = new TestObj { Val = "Changed in AssignNewInstance" };
            Console.WriteLine(testObj.Val);
        }
    }
}`

我认为您可能正在寻找的是通过引用传递值类型(bool)。你可以使用ref关键字来做到这一点。以下是相关节选:

ref关键字使参数通过引用传递,而不是通过值传递。按引用传递的效果是,对被调用方法中参数的任何更改都会反映在调用方法中。

所以,它应该改变变量,如果你改变你的代码如下(添加"ref"):

bool x = true;
string x = "";
Change_value(ref x);
if (!(x))
   x = "Ok";

然后Change_value会像这样声明:

void Change_value(ref bool someBool) { //do whatever }

bool是一个原语,所以它是通过value传递的(传递给change_value的副本)。如果你想在方法中改变它的值,你可以使用布尔类,像这样:

Boolean x = true;
string x = "";
Change_value(ref x);
if (!(x))
x = "Ok";

你必须在方法参数中使用ref前缀

void Change_value(ref Boolean x)
{
...
}

,并像这样命名:

Change_value(ref x);

你可以去MS explain: https://msdn.microsoft.com/en-us/library/14akc2c7.aspx

除非通过引用传递值X,否则X的值不应该改变。

您可以将b定义为类中的字段。一旦你这样做了,你只需要分配它,新的值将从那一刻起可用。

下面是一个简短的例子:

public static class Program
{
    private static bool b;
    public static void Main()
    {
        b = true;
        Console.WriteLine(b);
        DoStuff();
        Console.WriteLine(b);
    }
    private static void DoStuff()
    {
        b = false;
    }
}