I need to create a structure that looks like an int (but has an extra field that I need…), so I created a new structure named TestStruct added one method (test()) that I needed and overloaded some operators, and it seemed to be working well…
The sample below shows the problem. If the structure test() method is executed from the Val property then the Val property seems to lose the value, but if the method is executed on the Val2 variable, this one seems to keep the right value…
Why does this happen?
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
new TestClass();
}
}
public class TestClass
{
public TestStruct Val { get; set; }
private TestStruct Val2;
public TestClass()
{
Val.test();
Console.WriteLine(Val + "-> why is it not 10?");
//Direct assignment works well...
Val = 123;
Console.WriteLine(Val + "-> direct assingment works..");
//This way works too. Why doesn't it work with "get;" and "set;"?
Val2.test();
Console.WriteLine(Val2 + "-> it works this way");
}
}
public struct TestStruct
{
private Int32 _Value;
public long Offset { get; set; }
public static implicit operator TestStruct(Int32 value)
{
return new TestStruct { _Value = value };
}
public static implicit operator Int32(TestStruct value)
{
return value._Value;
}
public void test()
{
_Value = 10;
}
}
Your
structis wrong.For a very large number of reasons, you should never make a mutable struct.
Just like an
intorDateTimevalue is immutable and can never change, so too a specific value of yourstructmust never change at all.Instead, you can make functions that return a new, different value .
Here are some reasons that mutable structs are evil:
To answer the question,
Val.test()is equivalent toget_Val().test().Since structs are value types, `get_Val() (the automatically-generated property getter) returns a copy of the struct.
The original struct in the private backing field is not affected.