вылет консольного приложения - PullRequest
1 голос
/ 26 августа 2010

Это моя проблема:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public abstract class EntityMember<T>
    {
        public T Value { get; set; }
    }

    public class Int32EntityMember : EntityMember<int?>
    {
    }

    public class StringEntityMember : EntityMember<string>
    {
    }

    public class GuidEntityMember : EntityMember<Guid?>
    {
    }

    public class Entity 
    {
        public GuidEntityMember ApplicationId { get; private set; }
        public Int32EntityMember ConnectedCount { get; private set; }
        public GuidEntityMember MainApplicationId { get; private set; }
        public Int32EntityMember ProcessId { get; private set; }
        public StringEntityMember ProcessName { get; private set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Entity entity2 = new Entity();
            Guid empty = Guid.NewGuid();
            Guid applicationId = Guid.NewGuid();
            int Id = 10;
            string name = "koko";

            entity2.MainApplicationId.Value = new Guid?(empty);
            entity2.ApplicationId.Value = new Guid?(applicationId);
            entity2.ProcessId.Value = new int?(Id);
            entity2.ProcessName.Value = name;
            entity2.ConnectedCount.Value = 1;
        }
    }
}

Приложение полностью заблокировано на линии:

entity2.MainApplicationId. Value = new Guid? (empty); 

Почему?

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Исключение, которое вы получаете:

Ссылка на объект не установлена ​​для экземпляра объекта.

Это потому, что entity2.MainApplicationId равно нулю.Ваш класс Entity не имеет конструктора, который бы устанавливал MainApplicationId не равным NULL, поэтому вы видите ошибку.

Добавление конструктора в ваш класс Entity, как показано в приведенном ниже коде, приводит кв вашем коде, работающем без ошибок:

public Entity()
{
    ApplicationId = new GuidEntityMember();
    ConnectedCount = new Int32EntityMember();
    MainApplicationId = new GuidEntityMember();
    ProcessId = new Int32EntityMember();
    ProcessName = new StringEntityMember();
}

Использование Автоматически реализуемые свойства не приводит к тому, что базовые поля (которые создаются и управляются от вашего имени компилятором) будут new d, когда экземпляр построен.Таким образом, следующие два свойства не одинаковы:

public MyClass MyProperty { get; private set; }

private MyClass _myOtherProperty = new MyClass();
public MyClass MyOtherProperty
{
    get
    {
        return _myOtherProperty;
    }
    set
    {
        _myOtherProperty = value;
    }
}
0 голосов
/ 26 августа 2010

Попробуйте изменить строку на приведение типа:

entity2.ApplicationId.Value = (Guid?)(applicationId);
...