2016-03-03 5 views
0

Можно ли передавать бесконечное число параметров в мою функцию по ссылке?Передайте бесконечные параметры по ссылке (используя ключевые слова 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 } 
+2

Нету , вы не можете иметь массив ссылок в C#. –

+0

ОК ... Я просто нажал кнопку «Опубликовать свой вопрос» ... У меня даже не было времени для обновления моего браузера, и этот комментарий был отправлен. –

+1

Я не уверен, что это дубликат, но похоже: http://stackoverflow.com/questions/1776020/interesting-params-of-ref-feature-any-workarounds – misha130

ответ

1

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

Какая польза от такой функции? Obvioulsy вы хотите метод, который может изменить любой объект независимо от того, где он исходит, и кто его использует. Это вряд ли является перерывом на Single-Responsibility-principle класса, что делает его God-object.

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

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 
+0

Спасибо, это объясняет метод IEnumerable, но не помогает мне в том, как я использую функцию Test(). В моем примере (хотя и простой) не отображается намерение функции. Я хотел, чтобы вопрос был простым, чтобы получить простой ответ (что я и сделал, и поэтому я буду принимать ваш ответ, если вы смеете строку «Итак, простой ответ ...»). Я не думаю, что это что-то вроде " божественный объект ", хотя ... Мое намерение состояло в том, чтобы взять кучу объектов и записать их в массив байтов. Как я уже сказал, я могу это сделать уже. Просто хотел сделать это быстрее/проще. –