C#4.0可选的out / ref参数
C#4.0允许可选的out
或ref
参数吗?
如前所述,这是不允许的,我认为这是非常有意义的。 但是,要添加更多的细节,请参考C#4.0规范第21.1节的引用:
构造函数,方法,索引器和委托types的forms参数可以声明为可选的:
固定参数:
属性opt参数修饰符opttypes标识符default-argument opt
默认参数:
=expression
- 带有缺省 参数的固定 参数是可选参数 ,而不带缺省 参数的固定 参数是必需的参数 。
- 正式参数列表中的可选参数后面不能出现所需的参数。
ref
或out
参数不能有一个默认参数 。
没有。
解决方法是重载另一个没有 out / ref参数的方法,它只是调用你当前的方法。
public bool SomeMethod(out string input) { ... } // new overload public bool SomeMethod() { string temp; return SomeMethod(out temp); }
更新:如果你有C#7.0 ,你可以简化:
// new overload public bool SomeMethod() { return SomeMethod(out string temp); // declare out variable inline }
(感谢@Oskar指出了这一点。)
不,但另一个很好的select是让该方法为可选参数使用generics模板类,如下所示:
public class OptionalOut<Type> { public Type Result { get; set; } }
那么你可以使用它如下:
public string foo(string value, OptionalOut<int> outResult = null) { // .. do something if (outResult != null) { outResult.Result = 100; } return value; } public void bar () { string str = "bar"; string result; OptionalOut<int> optional = new OptionalOut<int> (); // example: call without the optional out parameter result = foo (str); Console.WriteLine ("Output was {0} with no optional value used", result); // example: call it with optional parameter result = foo (str, optional); Console.WriteLine ("Output was {0} with optional value of {1}", result, optional.Result); // example: call it with named optional parameter foo (str, outResult: optional); Console.WriteLine ("Output was {0} with optional value of {1}", result, optional.Result); }
实际上有一种方法可以做到这一点,是由C#所允许的。 这回到C ++,而是违反了C#的好的面向对象的结构。
谨慎使用此方法!
以下是使用可选参数声明和编写函数的方法:
unsafe public void OptionalOutParameter(int* pOutParam = null) { int lInteger = 5; // If the parameter is NULL, the caller doesn't care about this value. if (pOutParam != null) { // If it isn't null, the caller has provided the address of an integer. *pOutParam = lInteger; // Dereference the pointer and assign the return value. } }
然后调用这个函数:
unsafe { OptionalOutParameter(); } // does nothing int MyInteger = 0; unsafe { OptionalOutParameter(&MyInteger); } // pass in the address of MyInteger.
为了得到这个编译,你需要在项目选项中启用不安全的代码。 这是一个非常冒险的解决scheme,通常不应该被使用,但是如果你有一些奇怪的,神秘的,神秘的,pipe理层决定,那么在C#中需要一个可选的输出参数,那么这将允许你做到这一点。
ICYMI:包含在这里列举的C#7.0的新function中,现在允许“丢弃”作为输出参数以_的forms出现,以便让您忽略不关心的输出参数:
p.GetCoordinates(out var x, out _); // I only care about x
PS如果您也对“out var x”部分感到困惑,请阅读链接上有关“Out Variables”的新function。
这样怎么样?
public bool OptionalOutParamMethod([Optional] ref string pOutParam) { return true; }
您仍然必须将值传递给C#中的参数,但它是一个可选的参数参数。
void foo(ref int? n) { return null; }