2012-11-08 26 views
6

Lütfen "nedense özel okuyucu Int32 [] _array = new [] {8, 7, 5}; boş olabilir?Başlatılan okuma alanı null, neden?

Bu örnekte, çalışır ve _array her zaman boş değildir. Ama şirket kodumda bir simliar kodum var ve _array daima boş. Bu yüzden onu statik olarak ilan ettim.

Sınıf, WCF Sözleşmemden kısmi bir Proxy Sınıfıdır.

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

Bu bize uyan kodu göstermek ve çalışmıyor başka kod var söyleyecek çok kullanım değil. Bize çalışmayan kısa ama eksiksiz bir örnek vermelisiniz. –

+2

Burada çalışır ve kodunuzda çalışmıyorsa, kodunuzda yanlış bir şey olduğu oldukça açıktır. Göndermediğiniz sürece, herhangi bir yardım vermeyi zor buluyorum. – Gorpik

+0

LINQPad'de belirtilen şekilde çalışır. – Davio

cevap

10

WCF (alan başlatıcı içerir) yapıcısı çalışmaz, bu nedenle WCF tarafından oluşturulan herhangi bir nesne olduğunu null adlı olacaktır. İhtiyacınız olan diğer alanları başlatmak için serileştirme geri araması kullanabilirsiniz. Özellikle, [OnDeserializing]:

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

Salt okunur alanlar, böyle bir kurgunun dışında atanabilir mi? –

+0

@ Hile yapmadan, hayır. "Readlonly" –

+0

hile aracı yansıması kaldırılmalıdır? Ya da kullanılabilecek bazı özel özellikler var mı? –

1

Geçenlerde de bu konuya rastladım. Statik readonly değişkenleri olan statik olmayan bir sınıfım da vardı. Her zaman null ortaya çıktı. Bence bu bir hata. sınıfa bir statik yapıcı ekleyerek

Fix it:

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

Bu adamlar herhangi bir hata bildirmeden önce yanıt vermeyi düşünürdüm: http://stackoverflow.com/questions/34259304/static-property-is-null-after-being-assigned/34260123?noredirect=1 – Matt

İlgili konular