2012-11-08 38 views
6

Bất cứ ai có thể vui lòng giải thích, tại sao "riêng chỉ đọc Int32 [] _array = new [] {8, 7, 5};" có thể là null?Trường chỉ đọc được khởi tạo là null, tại sao?

Trong ví dụ này, nó hoạt động và _array luôn không phải là rỗng. Nhưng trong mã công ty của tôi, tôi có một mã simliar và _array luôn là null. Vì vậy, tôi buộc phải tuyên bố nó là tĩnh.

Lớp học là Lớp proxy một phần từ Hợp đồng WCF của tôi.

using System; 
using System.ComponentModel; 

namespace NullProblem 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var myClass = new MyClass(); 

      // Null Exception in coperate code 
      int first = myClass.First; 
      // Works 
      int firstStatic = myClass.FirstStatic; 
     } 
    } 

    // My partial implemantation 
    public partial class MyClass 
    { 
     private readonly Int32[] _array = new[] {8, 7, 5}; 
     private static readonly Int32[] _arrayStatic = new[] {8, 7, 5}; 

     public int First 
     { 
      get { return _array[0]; } 
     } 

     public int FirstStatic 
     { 
      get { return _arrayStatic[0]; } 
     } 
    } 

    // from WebService Reference.cs 
    public partial class MyClass : INotifyPropertyChanged 
    { 
     // a lot of Stuff 

     #region Implementation of INotifyPropertyChanged 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 

} 
+4

Nó không phải sử dụng nhiều để cho chúng ta thấy mã mà làm việc và nói có một số mã khác mà không hoạt động. Bạn cần cung cấp cho chúng tôi một ví dụ ngắn nhưng đầy đủ nhưng không hiệu quả. –

+2

Nếu nó hoạt động ở đây và không có trong mã của bạn, nó là khá rõ ràng rằng có cái gì đó sai trái với mã của bạn. Trừ khi bạn đăng nó, tôi cảm thấy khó khăn để cung cấp bất kỳ sự trợ giúp nào. – Gorpik

+0

Hoạt động như dự định trong LINQPad của tôi. – Davio

Trả lời

10

WCF không chạy hàm tạo (bao gồm trình khởi tạo trường), vì vậy mọi đối tượng do WCF tạo sẽ có giá trị rỗng. Bạn có thể sử dụng gọi lại tuần tự hóa để khởi tạo bất kỳ trường nào khác mà bạn cần. Cụ thể, [OnDeserializing]:

[OnDeserializing] 
private void InitFields(StreamingContext context) 
{ 
    if(_array == null) _array = new[] {8, 7, 5}; 
} 
+0

Có thể chỉ định các trường chỉ đọc bên ngoài một hàm tạo như thế này không? –

+0

@Louis không phải không gian lận, không. Các "readlonly" sẽ phải được loại bỏ –

+0

gian lận có nghĩa là sự phản ánh? Hoặc là có một số thuộc tính đặc biệt có thể được sử dụng? –

1

Gần đây tôi cũng gặp sự cố này. Tôi cũng có một lớp không tĩnh với các biến chỉ đọc tĩnh. Chúng luôn xuất hiện null. Tôi nghĩ đó là lỗi.

Khắc phục sự cố bằng cách thêm một constructor tĩnh để các lớp:

public class myClass { 
    private static readonly String MYVARIABLE = "this is not null"; 

    // Add static constructor 
    static myClass() { 
     // No need to add anything here 
    } 

    public myClass() { 
     // Non-static constructor 
    } 

    public static void setString() { 
     // Without defining the static constructor 'MYVARIABLE' would be null! 
     String myString = MYVARIABLE; 
    } 
} 
+0

Tôi muốn xem xét câu trả lời của kẻ này trước khi báo cáo bất kỳ lỗi nào: http://stackoverflow.com/questions/34259304/static-property-is-null-after-being-assigned/34260123?noredirect=1 – Matt

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