如何在函数中实例化空引用参数?
How do you instantiate a null reference parameter in a function?
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”保持为空。
所以我的问题是,如果我想实例化变量就像指针通过引用传递给函数怎么办?这可行吗?
您可以通过引用传递变量:
function(ref A a)
function(ref a);
既然你知道 C++,那就像 A**
。
考虑重构函数,使其returns成为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);
是否真的更好看具体情况。
都是关于在C#中按值或by reference传递参数的。
你做的是按值调用
如果改成引用调用就可以解决问题
private static void function(ref A a)
{
if (a == null) a = new A();
a.B = 2;
a.C = 3;
}
您可以使用ref
或out
,但请不要!通过参数使用 void
方法 return 值是定义代码的味道。这些关键字应该被视为与 goto
相当(即语言支持它们并且有一些边缘情况可以使用它们,但它们应该是最后的手段)。相反,让你的函数 return 值:
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
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”保持为空。
所以我的问题是,如果我想实例化变量就像指针通过引用传递给函数怎么办?这可行吗?
您可以通过引用传递变量:
function(ref A a)
function(ref a);
既然你知道 C++,那就像 A**
。
考虑重构函数,使其returns成为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);
是否真的更好看具体情况。
都是关于在C#中按值或by reference传递参数的。
你做的是按值调用 如果改成引用调用就可以解决问题
private static void function(ref A a)
{
if (a == null) a = new A();
a.B = 2;
a.C = 3;
}
您可以使用ref
或out
,但请不要!通过参数使用 void
方法 return 值是定义代码的味道。这些关键字应该被视为与 goto
相当(即语言支持它们并且有一些边缘情况可以使用它们,但它们应该是最后的手段)。相反,让你的函数 return 值:
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