chaps/chapettes, я понимаю, что есть вопросы, связанные с этим, но это несколько другое - все связанные вопросы, которые я мог найти, использовали только один параметр в качестве примера. В любом случае, до:Недвижимость по ref C# (много параметров)
В этом году я преобразовал исходный код, написанный на Delphi в C#. Помимо этого, объем моих задач заключался в оптимизации и общем улучшении базы кода. Исходный код был написан несколькими людьми, каждый из которых не обладает знаниями или опытом в отношении принципов или методов разработки программного обеспечения, поэтому некоторые из них являются абиссинскими.
Во всяком случае, возможно, кто-то может предоставить рекомендации/решение моих ссор:
В настоящее время в C# есть класс для хранения 9 значений:
class StoreStruct
{
int A1 { get; set;}
int B1 { get; set;}
int C1 { get; set;}
int A2 { get; set;}
int B2 { get; set;}
int C2 { get; set;}
int A3 { get; set;}
int B3 { get; set;}
int C3 { get; set;}
}
что теперь у меня есть проблема с том, что , в идеале, я хотел бы передать свойства этого класса в методы по ссылке. Однако я знаю, что не могу этого сделать. Вместо этого исходный код работает, создавая временные переменные temp, передает их по ref, а затем присваивает свойства класса этим значениям. Это можно рассматривать следующим образом:
private void MethodA()
{
var temp = new StoreStruct();
var a1 = 0;
var b1 = 0;
var c1 = 0;
var a2 = 0;
var b2 = 0;
var c2 = 0;
var a3 = 0;
var b3 = 0;
var c3 = 0;
if (expression1)
{
MethodB(ref a1, ref b1, ref c1, 1, 1);
temp.A1 = a1;
temp.B1 = b1;
temp.C1 = c1;
}
if (expression2)
{
MethodB(ref a2, ref b2, ref c2, 2, 2);
temp.A2 = a2;
temp.B2 = b2;
temp.C2 = c2;
}
if (expression3)
{
MethodB(ref a3, ref b3, ref c3, 3, 3);
temp.A3 = a3;
temp.B3 = b3;
temp.C3 = c3;
}
}
private void MethodB(ref int a, ref int b, ref int c, int num1, int num2)
{
a = num1 + num2;
b = num1 - num2;
c = num1 * num2;
}
То, что я хотел бы сделать в идеальном мире:
MethodB(ref temp.A1, ref temp.B1, ref temp.C1, 1, 1);
Глядя на другие должности, я понимаю, почему это не удовлетворяются в C# и откровенно говоря, я согласен с обоснованием этого. Я видел несколько обходных решений и несколько предложений в других сообщениях, но они относятся только к примеру с одним вызовом метода, и только один параметр передается по ref. У кого-нибудь есть элегантное решение, позволяющее мне обновлять свойства класса в MethodB без необходимости передавать временные переменные?
Можете ли вы передать «StoreStruct» в методы? – Chris
Свойства - это не что иное, как синтаксический сахар для вызовов функции getter и setter, поэтому вы не можете передавать их по ссылке. В общем случае в C#, если вы используете ref params, вы делаете это неправильно. Просто передайте класс StoreStruct и пусть функция задает свойства. Класс является ссылочным типом, поэтому по существу все объекты передаются «по ссылке» по умолчанию в C#. –
Будет ли смысл создавать массивы 'A',' B' и 'C'? Это может облегчить работу.Вы можете просто заменить их или создать свойства 'IList' с классом, который просто имитирует его (например, так, что 'A [1] = 3524' устанавливает' A1'), чтобы хотя бы централизовать эту запутанную логику, а не везде , но это может быть более запутанным. –