+ /// [CanBeNull] object Test() => null;
+ ///
+ /// void UseTest() {
+ /// var p = Test();
+ /// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException'
+ /// }
+ ///
+ /// [NotNull] object Foo() {
+ /// return null; // Warning: Possible 'null' assignment
+ /// }
+ ///
+ /// public void Foo([ItemNotNull]List<string> books)
+ /// {
+ /// foreach (var book in books) {
+ /// if (book != null) // Warning: Expression is always true
+ /// Console.WriteLine(book.ToUpper());
+ /// }
+ /// }
+ ///
+ /// public void Foo([ItemCanBeNull]List<string> books)
+ /// {
+ /// foreach (var book in books)
+ /// {
+ /// // Warning: Possible 'System.NullReferenceException'
+ /// Console.WriteLine(book.ToUpper());
+ /// }
+ /// }
+ ///
+ /// [StringFormatMethod("message")]
+ /// void ShowError(string message, params object[] args) { /* do something */ }
+ ///
+ /// void Foo() {
+ /// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string
+ /// }
+ ///
+ /// namespace TestNamespace
+ /// {
+ /// public class Constants
+ /// {
+ /// public static int INT_CONST = 1;
+ /// public const string STRING_CONST = "1";
+ /// }
+ ///
+ /// public class Class1
+ /// {
+ /// [ValueProvider("TestNamespace.Constants")] public int myField;
+ /// public void Foo([ValueProvider("TestNamespace.Constants")] string str) { }
+ ///
+ /// public void Test()
+ /// {
+ /// Foo(/*try completion here*/);//
+ /// myField = /*try completion here*/
+ /// }
+ /// }
+ /// }
+ ///
+ /// void Foo([ValueRange(0, 100)] int value) {
+ /// if (value == -1) { // Warning: Expression is always 'false'
+ /// ...
+ /// }
+ /// }
+ ///
+ /// void Foo([NonNegativeValue] int value) {
+ /// if (value == -1) { // Warning: Expression is always 'false'
+ /// ...
+ /// }
+ /// }
+ ///
+ /// void Foo(string param) {
+ /// if (param == null)
+ /// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol
+ /// }
+ ///
+ /// public class Foo : INotifyPropertyChanged {
+ /// public event PropertyChangedEventHandler PropertyChanged;
+ ///
+ /// [NotifyPropertyChangedInvocator]
+ /// protected virtual void NotifyChanged(string propertyName) { ... }
+ ///
+ /// string _name;
+ ///
+ /// public string Name {
+ /// get { return _name; }
+ /// set { _name = value; NotifyChanged("LastName"); /* Warning */ }
+ /// }
+ /// }
+ ///
+ /// Examples of generated notifications:
+ /// Function Definition Table syntax:
+ ///
+ /// [ContractAnnotation("=> halt")]
+ /// public void TerminationMethod()
+ ///
+ /// [ContractAnnotation("null <= param:null")] // reverse condition syntax
+ /// public string GetName(string surname)
+ ///
+ /// [ContractAnnotation("s:null => true")]
+ /// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty()
+ ///
+ /// // A method that returns null if the parameter is null,
+ /// // and not null if the parameter is not null
+ /// [ContractAnnotation("null => null; notnull => notnull")]
+ /// public object Transform(object data)
+ ///
+ /// [ContractAnnotation("=> true, result: notnull; => false, result: null")]
+ /// public bool TryParse(string s, out Person result)
+ ///
+ /// [LocalizationRequiredAttribute(true)]
+ /// class Foo {
+ /// string str = "my string"; // Warning: Localizable string
+ /// }
+ ///
+ /// [CannotApplyEqualityOperator]
+ /// class NoEquality { }
+ ///
+ /// class UsesNoEquality {
+ /// void Test() {
+ /// var ca1 = new NoEquality();
+ /// var ca2 = new NoEquality();
+ /// if (ca1 != null) { // OK
+ /// bool condition = ca1 == ca2; // Warning
+ /// }
+ /// }
+ /// }
+ ///
+ /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement
+ /// class ComponentAttribute : Attribute { }
+ ///
+ /// [Component] // ComponentAttribute requires implementing IComponent interface
+ /// class MyComponent : IComponent { }
+ ///
+ /// [Pure] int Multiply(int x, int y) => x * y;
+ ///
+ /// void M() {
+ /// Multiply(123, 42); // Warning: Return value of pure method is not used
+ /// }
+ ///
[MustUseReturnValue("Use the return value to...")]
.
+ ///
+ /// class Foo {
+ /// [ProvidesContext] IBarService _barService = ...;
+ ///
+ /// void ProcessNode(INode node) {
+ /// DoSomething(node, node.GetGlobalServices().Bar);
+ /// // ^ Warning: use value of '_barService' field
+ /// }
+ /// }
+ ///
+ /// [SourceTemplate]
+ /// public static void forEach<T>(this IEnumerable<T> xs) {
+ /// foreach (var x in xs) {
+ /// //$ $END$
+ /// }
+ /// }
+ ///
+ ///
+ /// [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")]
+ /// public static void forEach<T>(this IEnumerable<T> collection) {
+ /// foreach (var item in collection) {
+ /// //$ $END$
+ /// }
+ /// }
+ ///
+ /// Applying the attribute on a template method parameter:
+ ///
+ /// [SourceTemplate]
+ /// public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) {
+ /// /*$ var $x$Id = "$newguid$" + x.ToString();
+ /// x.DoSomething($x$Id); */
+ /// }
+ ///
+ ///
+ /// [ActionName("Foo")]
+ /// public ActionResult Login(string returnUrl) {
+ /// ViewBag.ReturnUrl = Url.Action("Foo"); // OK
+ /// return RedirectToAction("Bar"); // Error: Cannot resolve action
+ /// }
+ ///
+ /// public class MyStringCollection : List<string>
+ /// {
+ /// [CollectionAccess(CollectionAccessType.Read)]
+ /// public string GetFirstString()
+ /// {
+ /// return this.ElementAt(0);
+ /// }
+ /// }
+ /// class Test
+ /// {
+ /// public void Foo()
+ /// {
+ /// // Warning: Contents of the collection is never updated
+ /// var col = new MyStringCollection();
+ /// string x = col.GetFirstString();
+ /// }
+ /// }
+ ///
+ /// static void ThrowIfNull<T>([NoEnumeration] T v, string n) where T : class
+ /// {
+ /// // custom check for null but no enumeration
+ /// }
+ ///
+ /// void Foo(IEnumerable<string> values)
+ /// {
+ /// ThrowIfNull(values, nameof(values));
+ /// var x = values.ToList(); // No warnings about multiple enumeration
+ /// }
+ ///