Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

84 Commits

Repository files navigation

NonCopyableAnalyzer

Some kind of structs should not be copied (especially mutable structs). This package contains an analyzer for such a struct.

NuGet: https://www.nuget.org/packages/NonCopyableAnalyzer/

Example

A typical example of a non-copyable struct is ResizableArray. So I'll use it for explanation. Let's copy it from corefxlab and add an attribute named NonCopyable.

namespaceSystem.Collections.Sequences{// copy from corefxlab// a List<T> like type designed to be embeded in other types// this kind of type should not be copied[NonCopyable]publicstructResizableArray<T>{
...}

The analyzer checks the attribute only by name - any namespace, both internal and public are OK.

usingSystem;[AttributeUsage(AttributeTargets.Struct)]internalclassNonCopyableAttribute:Attribute{}

Now, the analyzer reports misuse of the non-copyable struct.

Misuse 1: pass by value

usingSystem.Collections.Sequences;classProgram{staticvoidMain(){vara=newResizableArray<short>();// do not pass a non-copyable by valueAddUtf16(a,"abcd");}staticvoidAddUtf16(ResizableArray<short>a,strings){foreach(varcins){a.Add((short)c);}}}

do not pass a non-copyable by value

Misuse 2: read-only

usingSystem.Collections.Sequences;classProgram{staticvoidMain(){vara=newResizableArray<short>();AddUtf16(a,"abcd");}staticvoidAddUtf16(inResizableArray<short>a,strings){foreach(varcins){// do not invoke methods/properties with ref readonlya.Add((short)c);}}}

do not invoke methods/properties with ref readonly

How to fix

In this case, you should use ref parameter.

usingSystem.Collections.Sequences;classProgram{staticvoidMain(){vara=newResizableArray<short>();AddUtf16(refa,"abcd");}staticvoidAddUtf16(refResizableArray<short>a,strings){foreach(varcins){a.Add((short)c);}}}

About

An analyzer for Non-Copyable structs.

Resources

Stars

38 stars

Watchers

4 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages