Skip to content

Instantly share code, notes, and snippets.

@jeremyrsellars
Last active May 22, 2017 15:27
Show Gist options
  • Save jeremyrsellars/2239e57d48d5efa3ed5f to your computer and use it in GitHub Desktop.
Save jeremyrsellars/2239e57d48d5efa3ed5f to your computer and use it in GitHub Desktop.
CSharp Code Guidelines
# editorconfig.org
# top-most EditorConfig file
root = true
# Default settings:
# A newline ending every file
# Use 2 spaces as indentation
# Trim trailing whitespace
[*]
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.cs]
indent_size = 4
[*.csproj]
indent_size = 2
[*.nuspec]
indent_size = 2

C# Coding Style Request for Comments

Guiding Principals:

  1. Don't fight the community
  2. Don't fight the tooling
  3. Don't fight teammates
    • Existing code style stands (until tooling cleans it up or a genuine code review occurs)

0. Style

  1. Why have a style?
  2. Who uses the style?
    • Any team may adopt this style.
  3. What is scope of the document?
    • Style only?
    • C# only? (what about F#, XAML)
    • Smell avoidance?
  4. How is the style defined?
    1. When possible, the style settings files should be checked into source control
    1. Is the code the standard? Or are the style settings files?
  5. How is the style maintained?
    • This is pretty organic
  6. How is the style enforced?
    • Each team decides

1. Namespaces Imports

using System;
using System.Collections;
using System.Collections.Generic;

using Another.Library;
Using See.How.These.Are.Sorted.Alphabetically;
using Some.Other.Library;

namespace Xample.CSharpCodingStyle
{
    // 1b, 3
    using ArgumentPairs = Dictionary<string,string>;
  • (a) Namespaces imports at the top, unless it makes more sense to do otherwise .
  • (b) Faux-typedef aliases are more succinct when put inside the namespace block.
    • As in using ArgumentPairs = Dictionary<string,string>;
  • (c) Namespaces should be ordered alphabetically, except...
  • (d) System.* namespaces should be grouped at the top.

2. Explicit scope modifiers (public, protected, internal, private).

  • (a) In C#, when scope modifiers are ommitted, the type/member has the least-visible scope possible.
  • (b) Specifying a scope modifier is necessary when extending scope, but is optional in the standard because it decreases the signal/noise ratio.
  • (c) static comes after scope modifiers
    • Do: public static
    • Don't: static public

3. Spaces in type/variable declarations?

  • (a) Spaces in types are undesireable since there would also be spaces separating it from the identifier.
  • (b) Use string[] instead of string [], and Dictionary<string,string> instead of Dictionary<string, string>.

4. Spacing

  • (a) A single space around binary operators like =, <, >, +=, etc.
  • (b) Prefer no spaces at the end of the line. (Avoid trailing whitespace)
  • (c) No spaces before commas (except indent, of course). 1 space after commas unless at end of line.
  • (d) [No space|single space] after keywords like if/else/switch/with/while/for/foreach.

5. Capitalization and Naming

    delegate string Format(object o);

    public enum BinaryDigit
    {
        Zero,
        One,
    }

    readonly Arguments arguments;

    public static readonly BinaryDigit DefaultDigit = BinaryDigit.Zero;

    static void Main(string[] args)
    {...}

    [Test]
    static void WhenItRains_ItPours()
    {...}
  • (a) Public, protected, internal, or anything usable outside the type (constants, fields, functions, etc.) use PascalCase.
  • (b) Types, Delegates, Methods, Enums, constant fields are PascalCase.
  • (c) Private fields use camelCase.
  • (d) Variables and let bindings are camelCase.
  • (e) Sometimes it seems necessary to put "punctuation" in a plain-language name, especially test names. Underscore works well for this: public class AfterPrinting_StatusChangeDialog{...}

6. Comments

  • (a) When to comment

    • Ottinger's Rules for Commenting Code
      1. Primary Rule - "Comments are for things that cannot be expressed in code."
      2. Redundancy Rule - "Comments which restate code must be deleted."
      3. Single Truth Rule - "If the comment says what the code could say, then the code must change to make the comment redundant."
  • (b)How to comment

    • (b1) Use // for comments, unless only commenting part of a expression or line.
    • (b2) Comments should be very close to the code they comment.

"A common fallacy is to assume authors of incomprehensible code will somehow be able to express themselves lucidly and clearly in comments." - https://twitter.com/KevlinHenney/status/381021802941906944

7. Xml Doc String comments

/// <summary>
/// Implementation of for the FizzBuzz sequence.
/// </summary>
public static class FizzBuzz{...}
  • (a) Use them for public classes, members, and arguments because our tooling checks for that.

8. Indentation

  • (a) Use spaces, not tabs
  • (b) Use (N) spaces per indent. (Jeremy likes 2. Softek historically uses 3. VS Default is 4, so perhaps we use N=4.)
  • (c) Do[n't] indent switch/case labels
  • (d) Don't fight the tooling because it is frustrating and leads to larger diffs.

9. Line Length guidelines

  • Start trying to break lines before 80 characters unless it severaly hurts readability. 90 should probably be a max.

10. Generic type constraints

  • (a) Generic type constraints where TKey : IInterface, new() should be on one line per type. TKey and TValue would each have a line.
  • (b) The where is indented one block further than the declaration.

11. {Blocks}

  • (a) The contents of each block is indented
  • (b) Blocks that are one line long don't need surrounding {}.
  • (c) Blocks that are one expression long don't require a surrounding {}.
  • (d) Some feel that statements should or should not be balanced. Like in the PrintImperative example, don't fight the tooling.
  • (e) Some feel that statements should or should not be balanced. Don't "correct" code already checked in because it makes the diff larger.

12. Using var (var identifier vs. MyType identifier)

  • (a) When specifying types that with language syntax like string, float, prefer using keywords to the System.String type name.
  • (b) Often the compiler can infer the type of a binding assignment, like var ageMonths = 12;.
    • When writing new code, prefer the use of var.
    • When modifying existing code, adopt the existing style.

13. Expression vs. Statement style

As the C# language becomes more expression-oriented (LINQ, expression-bodied members), this will probably become more of an issue.

  • (a) When an expression is all that is necessary, prefer using an expression to a series of statements.

14. What to optimize for

  • (a) Optimize for testability, correctness, readability, cleanliness (SOLID principals).
  • (b) Only sacrifice the above for performance if
    • there is an established set of benchmarks and performance acceptance criteria
    • and/or half the team agrees it's worth the sacrifice.
    • AND the performance test suite is automated.
    • Premature optimization often has a code smell

15. End of file should have an empty line

  • (a) So you can Ctrl+End
  • (b) Cleaner diffs
  • (c) Don't fight the tooling

16. Attributes

[STAThread]
static void Main()
{...}

// [Test, Pairwise]
[Test]
[Pairwise]
public void MyTest(
    [Values("a", "b", "c")] string a,
    [Values("+", "-")] string b,
    [Values("x", "y")] string c)
{
    Console.WriteLine("{0} {1} {2}", a, b, c);
}
  • (a) Type/Member attributes usually go on their own line indented at the same level as the declaration.
  • (b) When using parameter attributes, the attribute goes on the same line as the type and identifier.

17. Vertical comma-separated lists

    public enum BinaryDigit
    {
        Zero,
        One,
    }

    public static readonly BinaryDigit[] Five =
    {
        BinaryDigit.One,
        BinaryDigit.Zero,
        BinaryDigit.One,
    };

    public static readonly List<BinaryDigit> Six = new List<BinaryDigit>
    {
        BinaryDigit.One,
        BinaryDigit.One,
        BinaryDigit.Zero,
    };
  • (a) In enum declarations and initializers it is often useful to put each item on its own line. C# makes the trailing comma optional. **This guideline is all about reducing diff & merge conflicts.
    • For new code, prefer a trailing comma when allowed, in case another item is added later.
    • For existing code, only change it if there's another change to the line (like indention).

18. C# 6 Language features

19. Base Interfaces

In this example, the parameter could be List<T>, IList<T>, IReadOnlyCollection<T>, and if you later remove the sill print statement at the front, IEnumerable<T>.

    static void PrintList(List<object> items)
    {
        Console.WriteLine($"Here are the {items.Count} items:");
        foreach(var item in items)
            PrintImperative(item);
    }

One could argue that a method named Print* doesn't need access to the List<T>.Add method, for example. So List<T> and IList<T> aren't good choices. IEnumerable<T> and IReadOnlyCollection<T> then are better choices.

Resharper can suggest using the least-capable interface, like with a hint or suggestion.

Should the style specify anything about using base interfaces?

20. Seal classes by default?

http://stackoverflow.com/questions/2164170/should-i-seal-all-classes-i-know-shouldnt-ever-be-used-as-a-base-class Eric Lippert's answer. Tl;Dr:

Seal the class. Unseal it later if you find that (1) was the right choice.

21. Immutability

// 1a
using System;
using System.Collections;
using System.Collections.Generic;
namespace Xample.CSharpCodingStyle
{
// 1b, 3
using ArgumentPairs = Dictionary<string,string>;
class Arguments
{
public Arguments(string[] args)
: this (ParseArgumentPairs(args))
{
}
static ArgumentPairs ParseArgumentPairs(string[] args)
{
var list = new ArgumentPairs(StringComparer.InvariantCultureIgnoreCase);
for (int i = 0, j = 1; j < args.Length; i += 2, j += 2)
list[args[i]] = args[j];
return list;
}
public Arguments(ArgumentPairs pairs)
{
Func<string, bool> parseBool =
key => pairs.ContainsKey(key) && bool.Parse(key);
UseFunctional = parseBool("-Imperative");
UseImperative = parseBool("-Functional");
}
public bool UseFunctional { get; }
public bool UseImperative { get; }
}
// 2
public class Program
{
delegate string Format(object o);
public enum BinaryDigit
{
Zero,
One,
}
public static readonly BinaryDigit[] Five =
{
BinaryDigit.One,
BinaryDigit.Zero,
BinaryDigit.One,
};
public static readonly List<BinaryDigit> Six = new List<BinaryDigit>
{
BinaryDigit.One,
BinaryDigit.One,
BinaryDigit.Zero,
};
readonly Arguments arguments;
static void Main(string[] args)
{
new Program(new Arguments(args)).Run();
}
Program(Arguments args)
{
arguments = args;
}
public void Run()
{
Print(arguments);
}
// 10
static T CreateOne<T>()
where T : new()
{
return new T();
}
void Print(object obj)
{
if (arguments.UseImperative)
PrintImperative(obj);
if (arguments.UseFunctional)
PrintFunctional(obj);
}
static void PrintImperative(object obj)
{
// 11d
if(obj is string)
Console.WriteLine(@"string: """ + obj + @"""");
else if(obj is int)
Console.WriteLine(@"Int32: " + FizzBuzz.Calculate((int) obj));
else if(obj is IEnumerable)
{
Console.WriteLine("[");
foreach(var o in (IEnumerable)obj)
Console.WriteLine(" " + o);
Console.WriteLine("]");
}
else if(obj == null)
Console.WriteLine("<null>");
else
Console.WriteLine(obj);
}
public static void PrintFunctional(object obj)
{
Console.WriteLine(CreateOne<ObjectFormatter>().Format(obj));
}
static void PrintList(List<object> items)
{
Console.WriteLine($"Here are the {items.Count} items:");
foreach(var item in items)
PrintImperative(item);
}
}
}
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=08E1FC57D6AF664CBA04DCBC8702271C/AbsolutePath/@EntryValue">C:\Users\jeremy.sellars\Desktop\GitHub\2239e57d48d5efa3ed5f\Resharper.DotSettings</s:String>
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=08E1FC57D6AF664CBA04DCBC8702271C/RelativePath/@EntryValue">..\Resharper.DotSettings</s:String>
<s:Boolean x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=08E1FC57D6AF664CBA04DCBC8702271C/@KeyIndexDefined">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File08E1FC57D6AF664CBA04DCBC8702271C/@KeyIndexDefined">True</s:Boolean>
<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File08E1FC57D6AF664CBA04DCBC8702271C/RelativePriority/@EntryValue">1</s:Double></wpf:ResourceDictionary>
using System.Collections.Generic;
using System.Linq;
namespace Xample.CSharpCodingStyle
{
/// <summary>
/// Implementation of for the FizzBuzz sequence.
/// </summary>
public static class FizzBuzz
{
/// <summary>
/// The lazy sequence of FizzBuzz strings from 1 to Int32.MaxValue.
/// </summary>
public static readonly IEnumerable<string> Sequence = Range(1, int.MaxValue - 1);
/// <summary>
/// Calculates the specified range of FizzBuzz sequence.
/// </summary>
/// <param name="start">The first FizzBuzz number to calculate.</param>
/// <param name="count">The number of items to calculate.</param>
/// <returns></returns>
public static IEnumerable<string> Range(int start, int count) =>
Enumerable.Range(start, count).Select(Calculate);
/// <summary>
/// Converts the number to a string,
/// but for multiples of three print “Fizz” instead of the number
/// and for the multiples of five print “Buzz”.
/// For numbers which are multiples of both three and five print “FizzBuzz”.
/// </summary>
/// <param name="number">The number to convert to FizzBuzz.</param>
public static string Calculate(int number)
{
var by3 = DivisibleBy(number, 3);
var by5 = DivisibleBy(number, 5);
return
by3 && by5 ? "FizzBuzz"
: by3 ? "Fizz"
: by5 ? "Buzz"
: number.ToString();
}
static bool DivisibleBy(int number, int divisor) =>
number % divisor == 0;
}
}
using System.Collections;
using System.Linq;
using System.Text;
namespace Xample.CSharpCodingStyle
{
/// <summary>
/// Converts objects to more friendly strings.
/// </summary>
public class ObjectFormatter
{
/// <summary>
/// Formats the object as a string.
/// </summary>
/// <param name="obj">The object to format</param>
/// <returns>A string representing the object.</returns>
public string Format(object obj) =>
MaybeFormatString(obj)
?? MaybeFormatNull(obj)
?? MaybeFormatFizzBuzz(obj)
?? MaybeFormatEnumerable(obj);
static string MaybeFormatString(object obj) =>
obj is string
? @"string: """ + obj + @""""
: null;
static string MaybeFormatNull(object obj) =>
obj == null
? "<null>"
: null;
static string MaybeFormatFizzBuzz(object obj) =>
obj is int
? FizzBuzz.Calculate((int) obj)
: null;
static string MaybeFormatEnumerable(object obj) =>
(obj as IEnumerable)?.Cast<object>()
.Aggregate(
new StringBuilder().AppendLine("["),
(sb, item) => sb.Append(" ").AppendLine(item?.ToString()))
.AppendLine("]")
.ToString();
}
}
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"NETStandard.Library": "1.0.0-rc2-23704"
},
"frameworks": {
"dnxcore50": { }
}
}
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AROUND_MULTIPLICATIVE_OP/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_CATCH_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_FIXED_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_FOR_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_FOREACH_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_IF_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_LOCK_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_SIZEOF_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_SWITCH_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_TYPEOF_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_USING_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_WHILE_PARENTHESES/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_TERNARY_EXPR_STYLE/@EntryValue">CHOP_ALWAYS</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{3AC74C55-B0C8-4141-8CA9-14FFEF10BCB0}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Xample.CSharpCodingStyle</RootNamespace>
<AssemblyName>Xample.CSharpCodingStyle</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="FizzBuzz.cs" />
<Compile Include="ObjectFormatter.cs" />
<Compile Include="AProgram.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
<ItemGroup>
<None Include="AnIntroduction.md" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xample.CSharpCodingStyle", "Xample.CSharpCodingStyle.csproj", "{3AC74C55-B0C8-4141-8CA9-14FFEF10BCB0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3AC74C55-B0C8-4141-8CA9-14FFEF10BCB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AC74C55-B0C8-4141-8CA9-14FFEF10BCB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AC74C55-B0C8-4141-8CA9-14FFEF10BCB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AC74C55-B0C8-4141-8CA9-14FFEF10BCB0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=08E1FC57D6AF664CBA04DCBC8702271C/AbsolutePath/@EntryValue">C:\Users\jeremy.sellars\Desktop\GitHub\2239e57d48d5efa3ed5f\Resharper.DotSettings</s:String>
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=08E1FC57D6AF664CBA04DCBC8702271C/RelativePath/@EntryValue">..\Resharper.DotSettings</s:String>
<s:Boolean x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=08E1FC57D6AF664CBA04DCBC8702271C/@KeyIndexDefined">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File08E1FC57D6AF664CBA04DCBC8702271C/@KeyIndexDefined">True</s:Boolean>
<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File08E1FC57D6AF664CBA04DCBC8702271C/RelativePriority/@EntryValue">1</s:Double></wpf:ResourceDictionary>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment