2011-11-01 26 views
36

Cụ thể, liên quan đến lĩnh vực initializers (trong trường hợp này, tĩnh) - §17.11 trong ECMA 334:"Thứ tự văn bản" trên các lớp một phần có được định nghĩa chính thức không?

Nếu một lớp có chứa bất kỳ lĩnh vực tĩnh với initializers, những initializers được thực hiện theo thứ tự văn bản ngay trước khi thực hiện constructor tĩnh.

Bây giờ, nếu chúng tôi có nhiều lớp partial trong các tệp riêng biệt, đơn đặt hàng đó có được xác định ở bất kỳ đâu không? Ruột của tôi nói "không chính thức được xác định, nhưng có lẽ liên quan đến thứ tự bao gồm trong csproj, hoặc thứ tự ghi chú đến csc". Điều này có đúng không?

(và có, tôi nhận ra sẽ tốt hơn nếu tránh sự mơ hồ hoàn toàn - có thể bằng cách di chuyển tất cả khởi tạo sang một hàm tạo tĩnh).


Ví dụ, nếu tôi có a.cs:

using System; 
partial class Program 
{ 
    private static int Foo = Write("Foo"); 
    static int Write(string name) 
    { 
     Console.WriteLine(name); 
     return 0; 
    } 
    static void Main() 
    { 
     Console.WriteLine("[press any key]"); 
     Console.ReadLine(); 
    } 
} 

b.cs:

partial class Program 
{ 
    private static int Bar = Write("Bar"); 
} 

và:

<Compile Include="a.cs" /> 
<Compile Include="b.cs" /> 

thì đây là Foo sau đó Bar; nếu, tuy nhiên, đây là:

<Compile Include="b.cs" /> 
<Compile Include="a.cs" /> 

sau đó nó là Bar sau đó Foo. Điều này hỗ trợ quan sát, nhưng không nói rõ. §8.7.13 (khai báo kiểu một phần) không đưa ra nhận xét về thứ tự khi kết hợp các lớp partial. Vì thế; Có điều gì mạnh mẽ hơn chúng ta có thể nói ở đây, hoặc từ thông số ngôn ngữ C# hoặc từ tài liệu hướng dẫn sử dụng?

Ngoài ra, nó hoạt động tương tự với csc a.cs b.cs so với csc b.cs a.cs.

+2

câu hỏi rất hay –

Trả lời

18

Dưới đây là một đoạn trích từ C# đặc tả đó, được chụp bằng đoạn mã của bạn, dường như giải quyết rằng đây là hành vi không xác định:

10.2.6 viên

[...] Trật tự của các thành viên trong một loại hiếm khi có ý nghĩa đối với mã C#, nhưng có thể có ý nghĩa khi giao tiếp với các ngôn ngữ khác và môi trường. Trong những trường hợp này, thứ tự của các thành viên trong một loại được khai báo trong nhiều phần là không xác định.

Để công bằng, nó nói hiếm khi đáng kể, :) không đáng kể.

2

Tôi biết câu hỏi này là rất cũ, nhưng đây là phần chính xác của các đặc điểm kỹ thuật:

ECMA-334 (C# Language Specification), initializers Biến, phần 17.4.5:

Khi có khai báo trường trong nhiều loại khai báo một phần cho cùng một loại, thứ tự của các phần không được chỉ định. Tuy nhiên, trong mỗi phần bộ khởi tạo trường được thực thi theo thứ tự .

Vì vậy, các "trật tự văn bản" trong phần loại không phải là không xác định, chứ không phải đó là phần xác định. ;-)

Các vấn đề liên quan