.net - Unrecognized C# syntax -


let's have:

class foo {     public int intpropertyinfoo { get; set; }      public bar barpropertyina { get; set; } }  class bar {     public string stringpropertyinbar { get; set; } } 

then we'd instantiate foo object initializer:

public static void main(string[] args) {     var foo = new foo     {         intpropertyinfoo = 123,         barpropertyina = // ommiting new , type name - why compile?         {             stringpropertyinbar = "something"         }     }; } 

the syntax of initializing barpropertyina baffles me, because code compiles without warnings and, when run, throws nullreferenceexception. don't recognize syntax, seems have same effect when used field, rather property.

disassembling compiled code yields this:

.method public hidebysig static void  main(string[] args) cil managed {   .entrypoint   // code size       34 (0x22)   .maxstack  3   .locals init ([0] class test.foo foo)   il_0000:  nop   il_0001:  newobj     instance void test.foo::.ctor()   il_0006:  dup   il_0007:  ldc.i4.s   123   il_0009:  callvirt   instance void test.foo::set_intpropertyinfoo(int32)   il_000e:  nop   il_000f:  dup   il_0010:  callvirt   instance class test.bar test.foo::get_barpropertyina()   il_0015:  ldstr      "something"   il_001a:  callvirt   instance void test.bar::set_stringpropertyinbar(string)   il_001f:  nop   il_0020:  stloc.0   il_0021:  ret } // end of method program::main 

which looks like:

public static void main(string[] args) {     var foo = new foo     {         intpropertyinfoo = 123     };      foo.barpropertyina.stringpropertyinbar = "something"; } 

so supposed syntactic sugar initializing property's/field's members, provided property/field initialized in constructor?

yes, sort of shorthand initializing properties start empty rather null. .net collection properties example of this.

var cmd = new system.data.sqlclient.sqlcommand() {     parameters =      {         new system.data.sqlclient.sqlparameter() { parametername = "@p1", value = "somvalue"}     },     commandtext = "select 1 table1 value = @p1" }; 

it allows initialize values of read-only properties.

//compiles , works var message = new mailmessage { = { "test@stackoverflow.com" } };  message = new mailmessage {     // won't compile: read-only     = new mailaddresscollection { "test@stackoverflow.com" }, }; 

borrowed pretty verbatim article: http://www.codeducky.org/even-concise-c-object-initializers/

new-less initializer syntax allows make code bit more concise , use initialization syntax configuring read-only properties. indeed, since base class library , popular .net package classes follow empty on null pattern collection properties, can take advantage of new-less syntax them. finally, using new-less initialization means benefit leaving in place defaults object initialized with.


Comments

Popular posts from this blog

account - Script error login visual studio DefaultLogin_PCore.js -

xcode - CocoaPod Storyboard error: -