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/
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.
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);}}}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);}}}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);}}}
