Хорошо, я нашел еще один частичное решение моей проблемы. Вы можете использовать перегрузку, если вы хотите, чтобы некоторые ref/out-arguments имели нулевые значения:
void Test()
{
string ret1 = "", ret2 = "";
SomeFunction(ref ret1, ref ret2);
SomeFunction(null, ref ret2);
SomeFunction(ref ret1, null);
SomeFunction(null,null);
}
string null_string = "null";
void SomeFunction(ref string ret1,ref string ret2)
{
if(ret1!=null_string)
ret1 = "ret 1";
if(ret2!=null_string)
ret2 = "ret 2";
}
// Additional overloads, to support null ref arguments
void SomeFunction(string ret1,ref string ret2)
{
Debug.Assert(ret1==null);
SomeFunction(null_string,ret2);
}
void SomeFunction(ref string ret1,string ret2)
{
Debug.Assert(ret2==null);
SomeFunction(ret1,null_string);
}
void SomeFunction(string ret1,string ret2)
{
Debug.Assert(ret1==null&&ret2==null);
SomeFunction(null_string,null_string);
}
Неясно, какую проблему вы пытаетесь решить здесь. Кому нужны указатели, когда строковые переменные уже являются ссылками? –
C#, похоже, был * разработан *, чтобы скрыть указатели от программиста. Вообще говоря, манипуляция указателем излишне усложняет код C#, поскольку обычно существует гораздо более простой способ сделать то, что вы хотите. – Whatsit
Если строковые переменные являются ссылками, почему следующее не будет влиять на «s»: void main() {string s = "original string"; test1 (ref s); test2(); } статическая строка r; static void test1 (строка ref s) {r = s; } static void test2() {r = "измененная строка"; } – AareP