3

I had thought that this was one of the few solved problems in C# coding standards / style; Attributes always appear on the line above the thing to which they are applied a la

[SomeClassAttribute]
class SomeClass
{
   [SomeFieldAttribute]
   bool someField;

   [SomeEnumAttribute]
   SomeEnum
   { 
     SomeValue
   }

   [SomeMethodAttribute]
   void SomeMethod() 
   { 
   }
}

But recently I've started to see Attributes in-line with the thing to which they are applied:

[SomeClassAttribute] class SomeClass
{
   [SomeFieldAttribute] bool someField;

   [SomeEnumAttribute] SomeEnum
   { 
     SomeValue
   }

   [SomeMethodAttribute] void SomeMethod() 
   { 
   }
}

For example on the Microsoft website and in the FileHelpers open source project. Is this just laziness on the part of the author of example code, or something that people actually use on a day to day basis, and if so why?

satnhak
  • 149
  • 6

3 Answers3

6

The two pieces of code are identical. It's merely a styling choice.

I've always preferred the former style, so I'll keep doing that. Use the convention that is easier for you and your team.

George Stocker
  • 6,388
  • 2
  • 31
  • 55
6

You can't put the attribute on the line above if it's being applied to a parameter.

e.g. this example from an ASP.NET MVC book

public ViewResult List([DefaultValue(1)] int page)
{
    // ... 
}

Maybe this has led to some people choosing to write attributes inline?

Also another example involving LINQ to SQL mappings..

[Column] public string Name { get; set; }
[Column] public string Description { get; set; }
[Column] public decimal Price { get; set; }
[Column] public string Category { get; set; }

The [Column] attribute almost feels like another modifier like the public access or the type, I can see how it might feel comfortable to write it inline like that.

Carson63000
  • 10,510
  • 1
  • 28
  • 50
  • I think that you could put it above though for a method parameter, it's just that it might get a bit clunky. –  Apr 16 '11 at 13:11
  • @B Tyler - yep I suppose there's no reason to have all your parameters on one line of code, you could put them on separate lines with attributes above. Probably would violate some other code style rules, though! :-) – Carson63000 Apr 16 '11 at 22:08
2

The first method is preferred - you may have several attributes, and some of them very long, for example:

 [DebuggerDisplay("Collection with {Count} elements of {User} user")]
 [Conditional("DEBUG")]
 [Serializable]
 ... some security attributes ...
 ... some application specific attributes ...
 ... some resharper attributes ...

I have no idea on how to write them in one line and maintain readability...

Alex Netkachov
  • 214
  • 1
  • 2