Trước C# 6, việc khởi tạo thuộc tính không sử dụng trường sao lưu để khởi tạo giá trị mặc định. Trong C# 6, nó sử dụng các trường sao lưu để khởi tạo với Auto initialization properties mới.C# 6 Tự động khởi tạo Bất động sản và sử dụng các trường sao lưu
Tôi tò mò tại sao trước khi C# 6 IL sử dụng định nghĩa thuộc tính để khởi tạo. Có lý do cụ thể nào cho điều này không? hoặc là nó không được triển khai đúng trước C# 6?
Trước khi C# 6,0
public class PropertyInitialization
{
public string First { get; set; }
public string Last { get; set; }
public PropertyInitialization()
{
this.First = "Adam";
this.Last = "Smith";
}
}
trình biên dịch tạo Mã (IL đại diện)
public class PropertyInitialisation
{
[CompilerGenerated]
private string \u003CFirst\u003Ek__BackingField;
[CompilerGenerated]
private string \u003CLast\u003Ek__BackingField;
public string First
{
get
{
return this.\u003CFirst\u003Ek__BackingField;
}
set
{
this.\u003CFirst\u003Ek__BackingField = value;
}
}
public string Last
{
get
{
return this.\u003CLast\u003Ek__BackingField;
}
set
{
this.\u003CLast\u003Ek__BackingField = value;
}
}
public PropertyInitialisation()
{
base.\u002Ector();
this.First = "Adam";
this.Last = "Smith";
}
}
C# 6
public class AutoPropertyInitialization
{
public string First { get; set; } = "Adam";
public string Last { get; set; } = "Smith";
}
trình biên dịch tạo Mã (IL đại diện)
public class AutoPropertyInitialization
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string \u003CFirst\u003Ek__BackingField;
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string \u003CLast\u003Ek__BackingField;
public string First
{
get
{
return this.\u003CFirst\u003Ek__BackingField;
}
set
{
this.\u003CFirst\u003Ek__BackingField = value;
}
}
public string Last
{
get
{
return this.\u003CLast\u003Ek__BackingField;
}
set
{
this.\u003CLast\u003Ek__BackingField = value;
}
}
public AutoPropertyInitialization()
{
this.\u003CFirst\u003Ek__BackingField = "Adam";
this.\u003CLast\u003Ek__BackingField = "Smith";
base.\u002Ector();
}
}
Bạn có thể cho chúng tôi thấy mã C# 5 và/hoặc 6 dẫn đến IL này không? Câu đầu tiên của bạn gây nhầm lẫn cho tôi vì bạn không thể tự động khởi tạo thuộc tính trước C# 6 - bạn phải thực hiện nó trong một hàm tạo theo cách thủ công. –
Fileds phải được chỉ định trước khi ctor với khởi tạo autoproperty (spec nói như vậy). Và trước khi ctor - không có trường sao lưu bất động sản được khởi tạo đúng -> điều này đang được thực hiện trong ctor -> sử dụng các thuộc tính trực tiếp sẽ gây ra các đơn lẻ được sử dụng – Mafii
Bạn phải hiển thị toàn bộ đoạn mã, về cơ bản hiển thị toàn bộ lớp vì nó đã ở trong C# 5 và vì nó nằm trong C# 6, nếu không chúng ta chỉ có thể đoán được lý do tại sao trình biên dịch hoạt động như nó có vẻ cho bạn. –