Skip to content

C# Cheatsheets

Quick Reference

Cheatsheet

C# 6.0 / 7.0 - what is new

Readonly properties

public string FirstName { get; private set; }  // private set is accessible from the entire class

public string LastName { get; } // accessible only in constructor

public ICollection<double> Grades { get; } = new List<double>(); // property initializer

Expression-bodied function members

public override string ToString() => "Hi!";

Using static

using static System.String;
// also common: 
// using static System.Math;
// using static System.Linq.Enumerable;

if (IsNullOrWhiteSpace(lastName))
  throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));

Null checking

var first = person?.FirstName;
first = person?.FirstName ?? "Unspecified";

// preferred event handing in C# 6:
this.SomethingHappened?.Invoke(this, eventArgs);

String interpolation

public string GetFormattedGradePoint() => $"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average():F2}";

Exception Filters

public static async Task<string> MakeRequest()
{
  var client = new System.Net.Http.HttpClient();
  var streamTask = client.GetStringAsync("https://localHost:10000");
  try 
  {
    var responseText = await streamTask;
    return responseText;
  } 
  catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
  {
  return "Site Moved";
  }
}

List and dict initializers

private List<string> messages = new List<string>
{
  "Page not Found",
  "Page moved, but left a forwarding address.",
  "The web server can't come out to play today."
};

private Dictionary<int, string> webErrors = new Dictionary<int, string>
{
  [404] = "Page not Found",
  [302] = "Page moved, but left a forwarding address.",
  [500] = "The web server can't come out to play today."
};

Out variables

if (int.TryParse(input, out int result))
    WriteLine(result);
else
    WriteLine("Could not parse input");

Tuples

var letters = ("a", "b");

(string Alpha, string Beta) namedLetters = ("a", "b");
var alphabetStart = (Alpha: "a", Beta: "b");

public class Point
{
  public Point(double x, double y)
  {
  this.X = x;
  this.Y = y;
  }

  public double X { get; }
  public double Y { get; }

  // Deconstruct method
  public void Deconstruct(out double x, out double y)
  {
  x = this.X;
  y = this.Y;
  }
}

Ref return values

public static ref int Find3(int[,] matrix, Func<int, bool> predicate)
{
  for (int i = 0; i < matrix.GetLength(0); i++)
             for (int j = 0; j < matrix.GetLength(1); j++)
                      if (predicate(matrix[i, j]))
                          return ref matrix[i, j];
  throw new InvalidOperationException("Not found");
}
ref var item = ref MatrixSearch.Find3(matrix, (val) => val == 42);
Console.WriteLine(item);
item = 24;
Console.WriteLine(matrix[4, 2]);

Local functions

public static IEnumerable<char> AlphabetSubset3(char start, char end)
{
    if ((start < 'a') || (start > 'z'))
        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: "start must be a letter");
    if ((end < 'a') || (end > 'z'))
        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: "end must be a letter");
    if (end <= start)
        throw new ArgumentException($"{nameof(end)} must be greater than {nameof(start)}");
    return alphabetSubsetImplementation();

    IEnumerable<char> alphabetSubsetImplementation()
    {
        for (var c = start; c < end; c++)
            yield return c;
    }
}