{
    "Attribute using recommended pattern": {
        "prefix": "attribute",
        "body": [
            "[System.AttributeUsage(System.AttributeTargets.${1:All}, Inherited = ${2:false}, AllowMultiple = ${3:true})]",
            "sealed class ${4:My}Attribute : System.Attribute",
            "{",
            "    // See the attribute guidelines at",
            "    //  http://go.microsoft.com/fwlink/?LinkId=85236",
            "    readonly string positionalString;",
            "    ",
            "    // This is a positional argument",
            "    public ${4:My}Attribute(string positionalString)",
            "    {",
            "        this.positionalString = positionalString;",
            "        ",
            "        // TODO: Implement code here",
            "        ${5:throw new System.NotImplementedException();}",
            "    }",
            "    ",
            "    public string PositionalString",
            "    {",
            "        get { return positionalString; }",
            "    }",
            "    ",
            "    // This is a named argument",
            "    public int NamedInt { get; set; }",
            "}"
        ],
        "description": "Attribute using recommended pattern"
    },
    "Checked block": {
        "prefix": "checked",
        "body": [
            "checked",
            "{",
            "    $0",
            "}"
        ],
        "description": "Checked block"
    },
    "Class": {
        "prefix": "class",
        "body": [
            "class ${1:Name}",
            "{",
            "    $0",
            "}"
        ],
        "description": "Class"
    },
    "Console.WriteLine": {
        "prefix": "cw",
        "body": [
            "System.Console.WriteLine($0);"
        ],
        "description": "Console.WriteLine"
    },
    "do...while loop": {
        "prefix": "do",
        "body": [
            "do",
            "{",
            "    $0",
            "} while (${1:true});"
        ],
        "description": "do...while loop"
    },
    "Else statement": {
        "prefix": "else",
        "body": [
            "else",
            "{",
            "    $0",
            "}"
        ],
        "description": "Else statement"
    },
    "Enum": {
        "prefix": "enum",
        "body": [
            "enum ${1:Name}",
            "{",
            "    $0",
            "}"
        ],
        "description": "Enum"
    },
    "Implementing Equals() according to guidelines": {
        "prefix": "equals",
        "body": [
            "// override object.Equals",
            "public override bool Equals(object obj)",
            "{",
            "    //",
            "    // See the full list of guidelines at",
            "    //   http://go.microsoft.com/fwlink/?LinkID=85237",
            "    // and also the guidance for operator== at",
            "    //   http://go.microsoft.com/fwlink/?LinkId=85238",
            "    //",
            "    ",
            "    if (obj == null || GetType() != obj.GetType())",
            "    {",
            "        return false;",
            "    }",
            "    ",
            "    // TODO: write your implementation of Equals() here",
            "    ${1:throw new System.NotImplementedException();}",
            "    return base.Equals (obj);",
            "}",
            "",
            "// override object.GetHashCode",
            "public override int GetHashCode()",
            "{",
            "    // TODO: write your implementation of GetHashCode() here",
            "    ${2:throw new System.NotImplementedException();}",
            "    return base.GetHashCode();",
            "}"
        ],
        "description": "Implementing Equals() according to guidelines"
    },
    "Exception": {
        "prefix": "exception",
        "body": [
            "[System.Serializable]",
            "public class ${1:My}Exception : ${2:System.Exception}",
            "{",
            "    public ${1:My}Exception() { }",
            "    public ${1:My}Exception(string message) : base(message) { }",
            "    public ${1:My}Exception(string message, System.Exception inner) : base(message, inner) { }",
            "    protected ${1:My}Exception(",
            "        System.Runtime.Serialization.SerializationInfo info,",
            "        System.Runtime.Serialization.StreamingContext context) : base(info, context) { }",
            "}"
        ],
        "description": "Exception"
    },
    "Foreach statement": {
        "prefix": "foreach",
        "body": [
            "foreach (${1:var} ${2:item} in ${3:collection})",
            "{",
            "    $0",
            "}"
        ],
        "description": "Foreach statement"
    },
    "Reverse for loop": {
        "prefix": "forr",
        "body": [
            "for (int ${1:i} = ${2:length} - 1; ${1:i} >= 0 ; ${1:i}--)",
            "{",
            "    $0",
            "}"
        ],
        "description": "Reverse for loop"
    },
    "for loop": {
        "prefix": "for",
        "body": [
            "for (int ${1:i} = 0; ${1:i} < ${2:length}; ${1:i}++)",
            "{",
            "    $0",
            "}"
        ],
        "description": "for loop"
    },
    "if statement": {
        "prefix": "if",
        "body": [
            "if (${1:true})",
            "{",
            "    $0",
            "}"
        ],
        "description": "if statement"
    },
    "Indexer": {
        "prefix": "indexer",
        "body": [
            "${1:public} ${2:object} this[${3:int} index]",
            "{",
            "    get { $4 }",
            "    set { $0 }",
            "}"
        ],
        "description": "Indexer"
    },
    "Interface": {
        "prefix": "interface",
        "body": [
            "interface I${1:Name}",
            "{",
            "    $0",
            "}"
        ],
        "description": "Interface"
    },
    "Safely invoking an event": {
        "prefix": "invoke",
        "body": [
            "${1:EventHandler} temp = ${2:MyEvent};",
            "if (temp != null)",
            "{",
            "    temp($0);",
            "}"
        ],
        "description": "Safely invoking an event"
    },
    "Simple iterator": {
        "prefix": "iterator",
        "body": [
            "public System.Collections.Generic.IEnumerator<${1:ElementType}> GetEnumerator()",
            "{",
            "    $0throw new System.NotImplementedException();",
            "    yield return default(${1:ElementType});",
            "}"
        ],
        "description": "Simple iterator"
    },
    "Named iterator/indexer pair using a nested class": {
        "prefix": "iterindex",
        "body": [
            "public ${1:Name}Iterator ${1:Name}",
            "{",
            "    get",
            "    {",
            "        return new ${1:Name}Iterator(this);",
            "    }",
            "}",
            "",
            "public class ${1:Name}Iterator",
            "{",
            "    readonly ${2:ClassName} outer;",
            "    ",
            "    internal ${1:Name}Iterator(${2:ClassName} outer)",
            "    {",
            "        this.outer = outer;",
            "    }",
            "    ",
            "    // TODO: provide an appropriate implementation here",
            "    public int Length { get { return 1; } }",
            "    ",
            "    public ${3:ElementType} this[int index]",
            "    {",
            "        get",
            "        {",
            "            //",
            "            // TODO: implement indexer here",
            "            //",
            "            // you have full access to ${2:ClassName} privates",
            "            //",
            "            ${4:throw new System.NotImplementedException();}",
            "            return default(${3:ElementType});",
            "        }",
            "    }",
            "    ",
            "    public System.Collections.Generic.IEnumerator<${3:ElementType}> GetEnumerator()",
            "    {",
            "        for (int i = 0; i < this.Length; i++)",
            "        {",
            "            yield return this[i];",
            "        }",
            "    }",
            "}"
        ],
        "description": "Named iterator/indexer pair using a nested class"
    },
    "Lock statement": {
        "prefix": "lock",
        "body": [
            "lock (${1:this})",
            "{",
            "    $0",
            "}"
        ],
        "description": "Lock statement"
    },
    "MessageBox.Show": {
        "prefix": "mbox",
        "body": [
            "System.Windows.Forms.MessageBox.Show(\"${1:Text}\");$0"
        ],
        "description": "MessageBox.Show"
    },
    "Namespace": {
        "prefix": "namespace",
        "body": [
            "namespace ${1:Name}",
            "{",
            "    $0",
            "}"
        ],
        "description": "Namespace"
    },
    "#if": {
        "prefix": "ifd",
        "body": [
            "#if ${1:true}",
            "    $0",
            "#endif"
        ],
        "description": "#if"
    },
    "#region": {
        "prefix": "region",
        "body": [
            "#region ${1:Name}",
            "    $0",
            "#endregion"
        ],
        "description": "#region"
    },
    "Property and backing field": {
        "prefix": "propfull",
        "body": [
            "private ${1:int} ${2:myVar};",
            "public ${1:int} ${3:MyProperty}",
            "{",
            "    get { return ${2:myVar}; }",
            "    set { ${2:myVar} = value; }",
            "}",
            "$0"
        ],
        "description": "Property and backing field"
    },
    "propg": {
        "prefix": "propg",
        "body": [
            "public ${1:int} ${2:MyProperty} { get; private set; }$0"
        ],
        "description": "An automatically implemented property with a 'get' accessor and a private 'set' accessor. C# 3.0 or higher"
    },
    "prop": {
        "prefix": "prop",
        "body": [
            "public ${1:int} ${2:MyProperty} { get; set; }$0"
        ],
        "description": "An automatically implemented property. C# 3.0 or higher"
    },
    "sim": {
        "prefix": "sim",
        "body": [
            "static int Main(string[] args)",
            "{",
            "    $0",
            "    return 0;",
            "}"
        ],
        "description": "int Main()"
    },
    "Struct": {
        "prefix": "struct",
        "body": [
            "struct ${1:Name}",
            "{",
            "    $0",
            "}"
        ],
        "description": "Struct"
    },
    "svm": {
        "prefix": "svm",
        "body": [
            "static void Main(string[] args)",
            "{",
            "    $0",
            "}"
        ],
        "description": "void Main()"
    },
    "Switch statement": {
        "prefix": "switch",
        "body": [
            "switch (${1:switch_on})",
            "{",
            "    $0",
            "    default:",
            "}"
        ],
        "description": "Switch statement"
    },
    "Try finally": {
        "prefix": "tryf",
        "body": [
            "try",
            "{",
            "    $1",
            "}",
            "finally",
            "{",
            "    $0",
            "}"
        ],
        "description": "Try finally"
    },
    "Try catch": {
        "prefix": "try",
        "body": [
            "try",
            "{",
            "    $1",
            "}",
            "catch (${2:System.Exception})",
            "{",
            "    $0",
            "    throw;",
            "}"
        ],
        "description": "Try catch"
    },
    "Unchecked block": {
        "prefix": "unchecked",
        "body": [
            "unchecked",
            "{",
            "    $0",
            "}"
        ],
        "description": "Unchecked block"
    },
    "Unsafe statement": {
        "prefix": "unsafe",
        "body": [
            "unsafe",
            "{",
            "    $0",
            "}"
        ],
        "description": "Unsafe statement"
    },
    "Using statement": {
        "prefix": "using",
        "body": [
            "using (${1:resource})",
            "{",
            "    $0",
            "}"
        ],
        "description": "Using statement"
    },
    "While loop": {
        "prefix": "while",
        "body": [
            "while (${1:true})",
            "{",
            "    $0",
            "}"
        ],
        "description": "While loop"
    },
    "constructor": {
        "prefix": "ctor",
        "body": [
            "${1:public} ${2:ClassName}(${3:Parameters})",
            "{",
            "    $0",
            "}"
        ],
        "description": "constructor"
    },
    "xUnit Test": {
        "prefix": "fact",
        "body": [
            "[Fact]",
            "public void ${1:TestName}()",
            "{",
            "//Given",
            "",
            "//When",
            "",
            "//Then",
            "}$0"
        ],
        "description": "create xunit test method"
    }
}
