public static void Main()
Console.WriteLine("EXAMPLE 1");
var person = new Person { Name = "Sam", Age = 29 };
Console.Write("BEFORE: ");
Console.WriteLine(person);
Console.Write("AFTER: ");
Console.WriteLine(personCopy);
Console.WriteLine("EXAMPLE 2");
var person = new Person { Name = "Sam", Age = 29 };
TestOperationOnPseudoPointer(person);
Console.WriteLine("EXAMPLE 3");
var person = new Person { Name = "Sam", Age = 29 };
Console.Write("BEFORE: ");
Console.WriteLine(person);
TestOperationOnCustomPointer(new Pointer<Person>(value => person = value));
Console.Write("AFTER: ");
Console.WriteLine(person);
Console.WriteLine("EXAMPLE 4");
var person = new Person { Name = "Sam", Age = 29 };
Console.Write("BEFORE: ");
Console.WriteLine(person);
TestOperationOnNonPointer(person);
Console.Write("AFTER: ");
Console.WriteLine(person);
public static void TestOperationOnPseudoPointer(Nullable<Person> person)
public static void TestOperationOnCustomPointer(Pointer<Person> person)
person.Value.Name = "George";
public static void TestOperationOnNonPointer(Person person)
private readonly Func<T> getter;
private readonly Action<T> setter;
throw new InvalidOperationException();
throw new InvalidOperationException();
public Pointer(Func<T> getter)
public Pointer(Action<T> setter)
public Pointer(Func<T> getter, Action<T> setter)
public static bool operator ==(Pointer<T> pointer, T value) => pointer.Value == value;
public static bool operator !=(Pointer<T> pointer, T value) => pointer.Value != value;
public static bool operator ==(T value, Pointer<T> pointer) => value == pointer.Value;
public static bool operator !=(T value, Pointer<T> pointer) => value != pointer.Value;
public static bool operator ==(Pointer<T> pointer1, Pointer<T> pointer2) => pointer1.Value == pointer2.Value;
public static bool operator !=(Pointer<T> pointer1, Pointer<T> pointer2) => pointer1.Value != pointer2.Value;