Вызывающий метод передает объект в метод calle, где метод calle пытается изменить значения свойств полученного объекта при выполнении модификации, если происходит какое-то исключение, исключение будет вызвано вызывающим методом, но полученный объект будет частично / частично изменен. (потому что объекты имеют ссылочный тип)
Полу / частично заполненное - это то, чего я хотел бы избежать, при возникновении исключения хотел бы установить объект, передаваемый между методом, как ноль, или он должен иметь исходное состояние без какого-либо недавних изменений состояния. Как этого добиться в c#?
Пример кода:
class MyClass
{
public int MyProperty { get; set; }
public int MyProperty2 { get; set; }
[MyCustomAttribute]
public int MyProperty3 { get; set; }
}
MyClass DoSomething1(MyClass myClass)
{
try
{
var updatedClass = new MyClass();
updatedClass.MyProperty = 1;
updatedClass.MyProperty2 = 2;
MyClass fullyUpdatedClass = DoSomething2(updatedClass);
return fullyUpdatedClass;
}
catch (Exception)
{
//2. receives partially filled myClass, even though
//assigned 'null' on the catch block of calle i.e.,
//DoSomething2(), why? this behavior or I did something wrong?
return myClass;
}
}
//as per my business req., this function will updated only those properties
//decorated with [MyCustomAttribute]
MyClass DoSomething2(MyClass myClass)
{
try
{
var updatedClass = new MyClass();
//as per my business req., since MyProperty3 decorated with [MyCustomAttribute]
//ONLY it is getting updated here.
updatedClass.MyProperty3 = 1;
//@Patrick Mcvay, if I do like you have suggested below
//changes happened on "myClass" instance via DoSomething1() will be gone
myClass = updatedClass;
return myClass;
}
catch (Exception ex)
{
//1. though I am assigning null value here for targetted object,
//calling code (i.e., catch block of DoSomething1()) not receiving null object, instead partially filled obj. WHY?
myClass = null;
throw ex;
}
}