【问题标题】:How do you instantiate a null reference parameter in a function?如何在函数中实例化空引用参数?
【发布时间】:2015-08-28 10:03:34
【问题描述】:
class A
{
    public int B { get; set; }
    public int C { get; set; }
}

private static void function(A a)
{
    if (a == null) a = new A();
    a.B = 2;
    a.C = 3;
}

A a = new A(); //a is not null
a = null; // a is null
function(a); 
//a is still null

如果我使用 C++ 类比,我的理解是,虽然“a”是指向函数通过引用访问的“A”类型对象的指针,但指针本身用作值类型。最终结果是变量“a”保持为空。

所以我的问题是,如果我想实例化变量,就好像指针通过引用传递给函数一样?这可行吗?

【问题讨论】:

  • 看看ref关键字
  • out 是正确的,因为您覆盖了指针。
  • @MikeMiller 价值也随之而来。
  • 这可是个可怕的副作用。
  • 你并不总是“覆盖指针”,所以这里需要refout 不会编译。

标签: c# .net pass-by-reference pass-by-value


【解决方案1】:

你可以通过引用传递变量:

function(ref A a)
function(ref a);

既然你会 C++,那就像是A**

考虑重构函数,使其返回a 的新值:

private static A EnsureInitialized(A a) //renamed
{
    if (a == null) a = new A();
    a.B = 2;
    a.C = 3;
    return a; //now initialized
}

A a = ...; //maybe null
a = EnsureInitialized(a);

这是否真的更好取决于具体情况。

【讨论】:

    【解决方案2】:

    这都是关于在 C# 中按值或 by reference 传递的参数。

    你所做的是按值调用 如果您将其更改为通过引用调用它将解决问题

    private static void function(ref A a)
    {
        if (a == null) a = new A();
        a.B = 2;
        a.C = 3;
    }
    

    【讨论】:

      【解决方案3】:

      可以使用refout,但请不要!让void 方法通过参数返回值是定义代码的味道。这些关键字应被视为与goto 相当(即语言支持它们,并且在某些极端情况下可以使用它们,但它们应该是最后的工具)。相反,让你的函数返回值:

      private static A function(A a)
      {
          if (a == null) a = new A();
          a.B = 2;
          a.C = 3;
          return a;
      }
      
      A a = new A(); //a is not null
      a = null; // a is null
      a = function(a); // a is not null
      

      【讨论】:

      • 我自己正要按照这些思路发布一些东西(我打算走得更远一点,并建议该类也应该是不可变的)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      相关资源
      最近更新 更多