ich darüber eine von zwei Möglichkeiten gehen würde. Wenn Sie wirklich einen Verweis auf Ihr Objekt haben möchten, können Sie das in eine Klasse einbinden. Diese werden immer als Referenz übergeben, so dass Sie Ihre Änderung so erhalten, wie Sie es möchten, und Sie können sie auf Null setzen.
Hier ist ein Beispiel.
public class HolderObject
{
public string myStr {get; set;}
}
public class Program
{
public static void Main()
{
var xyz = new HolderObject() {
myStr = "1234"
};
Console.WriteLine(xyz.myStr);
FixString(xyz);
Console.WriteLine(xyz.myStr);
FixString();
Console.WriteLine(xyz.myStr);
}
private static bool FixString(HolderObject input = null)
{
if (input != null)
input.myStr = "test";
return true;
}
}
druckt
1234
test
Eine andere Lösung ist Ihre Funktion zu überlasten.
bool Foo()
{
// ...
return true;
}
bool Foo(ref int retVal = null)
{
// ...
if (retVal != null)
{
retVal = 5;
}
return Foo();
}
Ich mag es wirklich nicht. Ich bin gerade mitten in der Arbeit an Code in C#, der direkt aus C++ gezogen wurde. Funktionen, die 6 oder 7 Ebenen tief verschachtelt sind und ein Objekt ändern, das als Referenz übergeben wurde. Das ist schwer zu lesen, und wenn Sie sich die Warnungen zur Codeanalyse anschauen, wird es vorschlagen, dass Sie ref-Werte nicht verwenden.
Wenn Sie können, würde ich so weit wie möglich davon abweichen Ref übergeben und den Wert zurück, der geändert wurde. Oder übergeben Sie ein Objekt, das sowohl Ihren bool als auch Ihren neuen Wert enthält.
Sie könnten einen Nullable-Typ wie 'int?' Verwenden. Siehe: https://msdn.microsoft.com/en-us/library/2cf62fcy.aspx – NathanOliver
@NathanOliver Beachten Sie, dass dies funktioniert für 'ref int', für Parameter wie' ref string' das funktioniert nicht – xanatos
@ xanatos sind keine Zeichenfolgen, die standardmäßig in C# als NULL-Zeichen gesetzt werden können, so dass Sie '?' nicht verwenden müssen. – NathanOliver