Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 3rd, 2012  |  syntax: None  |  size: 2.64 KB  |  hits: 7  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. using System;
  2.  
  3. namespace ThePast
  4. {
  5.         public class User
  6.         {
  7.                 public string FirstName { get; set; }
  8.                 public string LastName { get; set; }
  9.                 public string EmailAddress { get; set; }
  10.                
  11.                 public User(string firstName, string lastName, string emailAddress)
  12.                 {
  13.                         FirstName = firstName;
  14.                         LastName = lastName;
  15.                         EmailAddress = EmailAddress;
  16.                 }
  17.         }
  18. }
  19.  
  20. namespace TheFuture
  21. {
  22.         public class MainClass
  23.         {
  24.                 public static void Main (string[] args)
  25.                 {
  26.                         var user = new User(new FirstName("Ian"), new LastName("Joyce"), new EmailAddress("ian.joyce@gmail.com"));
  27.                         Console.WriteLine(user);
  28.                        
  29.                         // Change my name and email.
  30.                         var user2  = user.With(new EmailAddress("ian.joyce2@gmail.com")).With(new LastName("Joyce 2"));
  31.                         Console.WriteLine(user2);
  32.                        
  33.                         Console.ReadKey();
  34.                 }
  35.         }
  36.  
  37.         // Implementing some ideas from http://jessitron.blogspot.com/2012/03/strong-typing-in-java-religious.html in C#
  38.         // Favor types and immutability.
  39.        
  40.         public class User
  41.         {
  42.                 private readonly FirstName firstName;
  43.                 public FirstName FirstName { get { return firstName; } }
  44.                
  45.                 private readonly LastName lastName;
  46.                 public LastName LastName { get { return lastName; } }
  47.                
  48.                 private readonly EmailAddress emailAddress;
  49.                 public EmailAddress EmailAddress { get { return emailAddress; } }
  50.                
  51.                 public User(FirstName firstName, LastName lastName, EmailAddress emailAddress)
  52.                 {
  53.                         this.firstName = firstName;
  54.                         this.lastName = lastName;
  55.                         this.emailAddress = emailAddress;
  56.                 }
  57.                
  58.                 public User With(FirstName firstName)
  59.                 {
  60.                         return new User(firstName, LastName, EmailAddress);    
  61.                 }
  62.                
  63.                 public User With(LastName lastName)
  64.                 {
  65.                         return new User(FirstName, lastName, EmailAddress);
  66.                 }
  67.                
  68.                 public User With(EmailAddress emailAddress)
  69.                 {
  70.                         return new User(FirstName, LastName, emailAddress);
  71.                 }
  72.                
  73.                 public override string ToString()
  74.                 {
  75.                         return string.Format("{0} {1} ({2})", FirstName, LastName, EmailAddress);
  76.                 }
  77.         }
  78.        
  79.         // These should override Equals and HashCode.
  80.        
  81.         public class FirstName
  82.         {
  83.                 private readonly string @value;
  84.                 public string Value { get { return value; } }
  85.                
  86.                 public FirstName(string @value)
  87.                 {
  88.                         this.value = @value;
  89.                 }
  90.                
  91.                 public override string ToString()
  92.                 {
  93.                         return Value;
  94.                 }
  95.         }
  96.        
  97.         public class LastName
  98.         {
  99.                 private readonly string @value;
  100.                 public string Value { get { return value; } }
  101.                
  102.                 public LastName(string @value)
  103.                 {
  104.                         this.value = @value;
  105.                 }                      
  106.                
  107.                 public override string ToString()
  108.                 {
  109.                         return Value;
  110.                 }
  111.         }
  112.        
  113.         public class EmailAddress
  114.         {
  115.                 private readonly string @value;
  116.                 public string Value { get { return value; } }
  117.                
  118.                 public EmailAddress(string @value)
  119.                 {
  120.                         this.value = @value;
  121.                 }
  122.                
  123.                 public override string ToString()
  124.                 {
  125.                         return Value;
  126.                 }
  127.         }
  128. }