7

谁能解释一下,为什么private readonly Int32[] _array = new[] {8, 7, 5};可以null

在此示例中,它有效,但_array始终无效null。但是在我的公司代码中,我有一个类似的代码,并且_array始终是null. 所以我被迫将其声明为静态的。

该类是我的 WCF 合同中的部分代理类。

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

2 回答 2

11

WCF 不运行构造函数(包括字段初始值设定项),因此由 WCF 创建的任何对象都将具有该 null。您可以使用序列化回调来初始化您需要的任何其他字段。特别是[OnDeserializing]

[OnDeserializing]
private void InitFields(StreamingContext context)
{
    if(_array == null) _array = new[] {8, 7, 5};
}
于 2012-11-08T15:00:10.003 回答
3

我最近也遇到了这个问题。我也有一个带有静态只读变量的非静态类。他们总是出现null我认为这是一个错误

通过向类添加静态构造函数来修复它:

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;
    }
}
于 2015-03-25T08:55:40.003 回答