Передать бесконечные параметры по ссылке (используя ключевые слова params и ref вместе)

Можно ли передать бесконечное количество параметров в мою функцию по ссылке?

Я знаю, что это не правильно, но есть ли способ сделать это?

private bool Test(ref params object[] differentStructures)
{
    //Change array here and reflect changes per ref
}

TestStructOne test1 = default(TestStructOne);
TestStructTwo test2 = default(TestStructTwo);
TestStructOne test3 = default(TestStructOne);
if (Test(test1, test2, test3)) { //happy dance }

Я знаю, что мог бы сделать следующее, но я надеюсь избавиться от необходимости создавать дополнительную переменную, которая будет содержать все объекты...

private bool Test(ref object[] differentStructures)
{
    //Change array here and reflect changes per ref
}

TestStructOne test1 = default(TestStructOne);
TestStructTwo test2 = default(TestStructTwo);
TestStructOne test3 = default(TestStructOne);
object[] tests = new object[] { test1, test2, test3 };
if (Test(ref tests)) { //simi quazi happy dance }

1 ответ

Решение

Таким образом, простой ответ - нет, у вас не может быть метода, возвращающего бесконечное число ссылок.

Какая польза от такой функции? Очевидно, вам нужен метод, который может изменить любой объект, независимо от того, откуда он и кто его использует. Это вряд ли является нарушением принципа единой ответственности класса, превращая его в объект Бога.

Однако вы можете создать экземпляры в перечислении:

private bool Test(object[] differentStructures)
{
    differentStructures[0] = someOtherRessource;
    differentStructures[1] = anotherDifferentRessource
    differentStructures[2] = thirdDifferentRessource
}

И назовите это как:

var tests = new[] {
    default(TestStructOne),
    default(TestStructTwo),
    default(TestStructOne)
}
Test(tests);

Что приведет к следующему:

tests[0] = someOtherRessource;
tests[1] = anotherDifferentRessource
tests[2] = thirdDifferentRessource
Другие вопросы по тегам