2012-01-24 27 views
5

Tôi đang cố truy cập trường static của số struct mà tôi đã xác định là công khai. Tuy nhiên, tôi vẫn còn "không thể tiếp cận do mức độ bảo vệ của nó" Bất cứ ai có thể giúp tôi?C# Cách truy cập trường tĩnh của cấu trúc công khai

public class Program 
{ 
    public struct AT_CMD 
    { 
     static int x = 7; 
     static byte[] cmd_mode = new byte[3] { 0x2B, 0x2B, 0x2B }; 
     static byte[] end_device_assoc = new byte[4] { 0x41, 0x54, 0x41, 0x31 }; 
     //should be 0 for end device, default is 0 
     static byte[] data_rate = new byte[4] { 0x41, 0x54, 0x42, 0x44 }; //3 for 9600, 5 for 38400 
     static byte[] channel = new byte[4] { 0x41, 0x54, 0x43, 0x48 }; //0x0B-0x1A 
     static byte[] Dest_addr_high = new byte[4] { 0x41, 0x54, 0x44, 0x48 }; //0 FOR 16bit 
     static byte[] Dest_addr_low = new byte[4] { 0x41, 0x54, 0x44, 0x4C }; 
     static byte[] my_addr = new byte[4] { 0x41, 0x54, 0x4D, 0x59 }; // 0-0xFFFF 
     static byte[] carriage_return = new byte[1] { 0x0D }; 
    } 

    static void Main() 
    { 
     int y = AT_CMD.x; 
    } 
} 

Trả lời

4

Theo trường mặc định là riêng. Thêm công cụ sửa đổi hạn chế nhất mà vẫn cho phép bạn làm việc với cấu trúc.

public struct AT_CMD 
{ 
    public static int x = 7; 
} 

static void Main() 
{ 
    int y = AT_CMD.x; 
} 
4

Cấu trúc là công khai, nhưng các thành viên thì không.

8

Thay đổi nó để:

public struct AT_CMD 
    { 
     public static int x = 7; 

     // ... 
    } 

Chỉ cần thực hiện một structpublic không ảnh hưởng đến các thành viên, các thành viên của struct sẽ private theo mặc định trừ khi bạn chỉ định khác.

CẬP NHẬT: Phát biểu tại sự nhầm lẫn về truy cập mặc định, internal là truy cập mặc định cho struct hoặc class chính nó nếu tuyên bố ở cấp namespace (không lồng nhau trong một lớp/struct):

lớp và các cấu trúc được khai báo trực tiếp trong một không gian tên (trong các từ khác, không được lồng trong các lớp hoặc cấu trúc khác) có thể là công khai hoặc nội bộ. Nội bộ là mặc định nếu không có quyền truy cập công cụ sửa đổi được chỉ định.

Trong khi đó, các trường trong một class hoặc struct luôn mặc định private:

Mức truy cập cho các thành viên lớp và các thành viên struct, bao gồm lớp lồng nhau và cấu trúc, là tin theo mặc định.

Từ MSDN.

+0

cảm ơn rất nhiều, vì vậy ngay cả khi tĩnh, vẫn riêng tư ... phải không? – fiftyplus

+0

@gpakillsme: Không, về mặt kỹ thuật, mặc định là 'nội bộ', mặc dù sự khác biệt có thể không quan trọng đối với trường hợp của bạn. Xem [tại đây] (http://msdn.microsoft.com/en-us/library/ms173121.aspx) để biết thêm thông tin. –

+1

@BlueRaja: Thực ra, nội bộ là mặc định cho một cấu trúc/lớp không lồng nhau (có nghĩa là 'struct AT_CMD' giống như' internal struct AT_CMD' nếu không lồng nhau). Mặc định cho các thành viên class/struct là 'private'. –

2

Khai báo họ như thế này:

public static byte[] cmd_mode = new byte[3] { 0x2B, 0x2B, 0x2B }; 

Tuy nhiên, có vẻ như bạn có nghĩa là những là hằng số. Trong trường hợp đó, họ thực sự nên được tuyên bố như thế này:

public static readonly IEnumerable<byte> cmd_mod = new byte[3] { 0x2B, 0x2B, 0x2B }; 
+0

Tôi muốn giới thiệu một 'ReadOnlyCollection 'ở đây, nếu không có gì khác ngoài sự rõ ràng. –

+0

@Mr.Thất vọng: 'ReadOnlyCollection ' hiếm khi được sử dụng trong thực tế - vì bất kỳ lý do gì, 'IEnumerable 'gần như luôn luôn * ưa thích * (có thể vì nó không yêu cầu bản sao) *. Điều đó đang được nói, 'IEnumerable 'không có một chỉ mục trong khi' ReadOnlyCollection 'hiện, do đó, nếu đó là quan trọng,' ReadOnlyCollection 'có thể là sự lựa chọn duy nhất của bạn. –

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