【问题标题】:C# Pointers in a Method's arguments?方法参数中的 C# 指针?
【发布时间】:2011-04-08 21:21:47
【问题描述】:

我希望在方法内部直接修改变量的值。
指针就是方法,对吗?

怎么做?

【问题讨论】:

    标签: c# variables pointers methods


    【解决方案1】:

    没有。在 c# 中,您可以使用 refout 修饰符应用按引用传递语义:

    void Foo( ref string s, ref int x )
    {
        s = "Hello World"; // caller sees the change to s
        x = 100;           // caller sees the change to x
    }
    
    // or, alternatively...
    
    void Bar( out string s )
    {
        s = "Hello World"; 
    }
    

    这两者的区别在于out,调用者在调用方法时不必指定值,因为要求被调用的方法在退出前会赋值。

    在 C# 中,“指针”是您只能在 unsafe code 中使用的东西。与 C 或 C++ 中一样,C# 中的指针允许您引用变量或对象的位置。 C# 中的引用是不同的——你不应该将它们视为指针——它们旨在更加不透明,并提供一种“引用”变量或对象的方式,而不必暗示它们指示其在内存中的位置。

    通过引用,您可以使用特殊关键字(outref)将别名传递给变量。这些仅在方法调用的上下文中可用 - 编译器可以使用有关引用的生命周期的信息来确保引用不会超过被别名的原始变量。

    【讨论】:

    • 我认为这与垃圾收集器有关?
    • 我不禁想到不可变的引用类型(字符串)不是展示ref参数的最佳主题。
    【解决方案2】:

    可以使用方法参数关键字ref

    void modifyFoo(ref int foo)
    {
        foo = 42;
    }
    

    这样调用:

    int myFoo = 0;
    modifyFoo(ref myFoo);
    Console.WriteLine(myFoo);
    

    结果:

    42
    

    来自文档:

    方法参数上的 ref 方法参数关键字导致方法引用传递给方法的相同变量。当控制权传回调用方法时,对方法中的参数所做的任何更改都会反映在该变量中。

    要使用 ref 参数,该参数必须显式地作为 ref 参数传递给方法。 ref 参数的值将传递给 ref 参数。

    【讨论】:

      【解决方案3】:

      使用ref。例如。 Foo(ref int i) 将允许 Foo 通过引用调用者的值来更改 i 的值。

      【讨论】:

        【解决方案4】:

        指针就是方法,对吗?

        不在 C# 中,它们不是。使用 ref 参数:

         void Times2(ref int a) { a = a * 2; }
        
         void Foo()
         {
              int x = 1;
              Times2(ref x);
              // x is now 2 
         }
        

        【讨论】:

          【解决方案5】:

          如果该值是一个类,那么它已经通过引用传递,并且不需要其他任何东西,除非您需要将对象分配给val = anotherobject,那么您需要使用 ref 或 out 关键字。

          如果它是一个结构(int、float、long、double 等),那么您必须使用 ref(如果对象可能会或可能不会更改)或 out(如果对象将被更改)。用 ref 或 val 标记的方法中可以有多个参数。

          【讨论】:

            猜你喜欢
            • 2015-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-12
            • 1970-01-01
            相关资源
            最近更新 更多