2010-08-26 5 views
1

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

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); 

Почему?

+1

Какую ошибку (если таковые имеются) вы видите? – ChrisF

+0

Koka, добро пожаловать в stackoverflow =) Когда вы задаете вопрос здесь, всегда полезно показывать как можно больше актуальной информации, поэтому контент любых исключений, которые вы видите, полезен, а также ваш код =) Если один из наших ответов решает вашу проблему, нажмите на кнопку галочки рядом с ответом, чтобы отметить его как ваш «принятый ответ». Убедившись, что вы это делаете, люди склонны отвечать на любые будущие вопросы, которые вы задаете здесь. =) (* Edit: Который я вижу, что вы только что закончили! *) – Rob

ответ

2

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

Object reference not set to an instance of an object.

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

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

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

Использование Auto-Implemented properties не приводит к нижележащих полей (которые создаются и управляются от вашего имени компилятором) при создании экземпляра является new 'd. Таким образом, эти два свойства, которые следуют не то же самое:

public MyClass MyProperty { get; private set; } 

private MyClass _myOtherProperty = new MyClass(); 
public MyClass MyOtherProperty 
{ 
    get 
    { 
     return _myOtherProperty; 
    } 
    set 
    { 
     _myOtherProperty = value; 
    } 
} 
+2

На самом деле все поля 'entity2' равны нулю – ChrisF

+0

Спасибо для ответа. Но для геттера и сеттера я думаю, что два одинаковые, public MyClass myProperty (get; set;) private MyClass = new MyClass _myOtherProperty(); общественного MyClass MyOtherProperty ( получить ( _myOtherProperty возвращение; ) вместе ( _myOtherProperty = значение; ) ) – Koka

+0

@Koka, два явно * не * такой же, как я уже объяснял в ответьте, потому что в первом «авто-имуществе» поле поддержки не получает экземпляр «MyClass' new'd вверх, тогда как во втором примере оно выполняется. – Rob

0

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

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