2009-10-17 27 views
15

Tôi đang chuyển đổi Java thành C# và có mã sau đây (xem discussion in Java Context về việc sử dụng nó). Một cách tiếp cận có thể là tạo một tệp/lớp riêng biệt nhưng có một C# idom giữ nguyên ý định trong mã Java không?C# có tương đương với lớp lồng nhau Java tĩnh không?

public class Foo { 

    // Foo fields and functions 
    // ... 
     private static class SGroup { 
      private static Map<Integer, SGroup> idMap = new HashMap<Integer, SGroup>(); 

      public SGroup(int id, String type) { 
    // ... 
      } 
     } 
    } 

Trả lời

3

này cung cấp cho một cái nhìn http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx

Tôi đang tìm kiếm đặc biệt tại

Nói cách khác, các lớp bên trong Java là cú pháp đường mà không có sẵn sang C#. Trong C#, bạn phải làm điều đó theo cách thủ công.

Nếu bạn muốn, bạn có thể tạo đường của riêng bạn:

class OuterClass { 
... 
InnerClass NewInnerClass() { 
    return new InnerClass(this); 
} 
void SomeFunction() { 
    InnerClass i = this.NewInnerClass(); 
    i.GetOuterString(); 
} 
} 

Trong trường hợp bạn muốn viết bằng Java mới o.InnerClass (...) bạn có thể viết trong C# hoặc o. NewInnerClass (...) hoặc mới InnerClass (o, ...). Vâng, đó chỉ là một nhóm di chuyển từ mới xung quanh. Như tôi đã nói, đó chỉ là đường.

+0

Blog hữu ích và cho thấy rằng cấu trúc có thể dẫn đến một số cú pháp xấu xí. –

+9

Lớp lồng nhau tĩnh của Java chỉ dành cho cơ chế phạm vi. Lớp lồng nhau tĩnh của Java dịch trực tiếp sang C#: 'class Foo {class Group {}}'. Đây không phải là câu trả lời đúng, chọn @JonSkeet answer –

67

Tất cả # lồng lớp C là như Java tĩnh lớp lồng nhau:

C#:

class Outer 
{ 
    class Inner 
    { 
    } 
} 

là như Java:

class Outer 
{ 
    static class Inner 
    { 
    } 
} 

Nói cách khác, một thể hiện của Innerkhông có tham chiếu ngầm định đối với phiên bản Outer.

không phải là tương đương với một lớp Java bên trong trong C#.

Quy tắc trợ năng có phần khác nhau giữa hai ngôn ngữ mặc dù: trong C#, mã trong lớp lồng nhau có quyền truy cập vào các thành viên riêng tư trong lớp chứa; trong Java, nó là một cách khác.

+1

Tôi nghĩ rằng bạn có nghĩa là tất cả các lớp * không tĩnh * C# lồng nhau giống như các lớp lồng nhau Java tĩnh? – Mishax

+0

@Mishax: Vâng, các lớp tĩnh trong C# không có tương đương trong Java, cho dù chúng là cấp cao nhất hay lồng nhau. –

+1

Điều đó đúng! Quan điểm của tôi là bạn nhấn mạnh "Tất cả" trong câu trả lời của bạn và tôi nghĩ rằng câu lệnh "Tất cả các lớp C# lồng nhau giống như các lớp lồng nhau Java tĩnh" là false – Mishax

0

Bạn có thể có lớp lồng nhau tĩnh trong C#, theo Nested Classes.

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