Список внутри объекта снова становится пустым после выхода из функционального блока - PullRequest
0 голосов
/ 09 октября 2019

У меня есть объект 'ForValidation', у которого в качестве свойства есть список int, и объект 'Validator', у которого есть метод Verify (IEnumerable ForValidation). Метод Verify добавляет числа в свойство списка ForValidation.

В основной функции у меня есть IEnumerable из Validator и IEnumerable из ForValidation

при каждом выходе из Verify (IEnumerable), список внутри ForValidation возвращается в 0count.

Насколько я понимаю, объекты являются ссылочными типами в C #, и модификации из любого места должны отражаться в одном и том же объекте.

Я попытался запустить отладчик Visual Studio построчно, чтобы проверить этот список внутри 'ForValidation 'фактически добавляется в данные и затем исчезает после метода Verify.

    public class ForValidation
    {
        private readonly object @lock = new object();

        private readonly List<int> ExistenceChecks = new List<int>();

        public IEnumerable<int> ExistsPlaces => ExistenceChecks;

        public string CheckProperty { get; }

        public ForValidation(string checkProperty )
        {
            CheckProperty = checkProperty ;
        }

        public void ConfirmExistence(int place)
        {
            lock (@lock)
            {
                ExistenceChecks.Add(place);
            }
        }
    }
    public class Validator 
    {

        public int ValidatorNumber { get; }

        private readonly Datasource somedatasource;

        public Validator(int number, Datasource someds)
        {
            ValidatorNumber = number;
            somedatasource = someds;
        }

        public void Verify(IEnumerable<ForValidation> forValidations)
        {
            ForValidation[] copy = forValidations.ToArray();

            IEnumerable<string> checkProperties = from member in copy 
                                                  select member.CheckProperty;

            IEnumerable<CompareAgainst> existingMembers 
              = somedatasource.Filter(new CheckPropertiesFilter(checkProperties)).Execute();

            foreach (ForValidation forValidation in copy)
            {
                if (existingMembers.FirstOrDefault(m => m.CheckProperty == forValidation.CheckProperty) != null)
                {
                    forValidation.ConfirmExistence(ValidatorNumber);
                }
            }

            int x = copy.Length;
            //each forValidation.ExistsPlaces has items until this code block
        }
    }
    main
    {
        private readonly IEnumerable<ForValidation> forValidations {...}

        private readonly IEnumerable<Validator> validators {...}

        foreach (Validator validator in validators)
        {
            validator.Verify(forValidations); 
            // each forValidation.ExistsPlaces count is 0 again in this block
        }
    }

IExpect Каждый элемент ForValidation внутри forValidations будет иметь запомненные элементы в своем свойстве IEnumerable ExistsPlaces после каждого метода Verifyвалидаторы, но он становится равным 0 после каждой итерации метода Verify в цикле foreach

1 Ответ

0 голосов
/ 09 октября 2019

Я не могу воспроизвести вашу проблему. Вот мой код.

public static void Main(string[] args)
{
    var validators = new[] { new Validator(666), new Validator(667) };
    var forValidations = new [] { new ForValidation("v1"), new ForValidation("v2") };

    Console.WriteLine("Before Verify");
    foreach (var fv in forValidations)
        Console.WriteLine($"Object: {fv.CheckProperty} - count of places: {fv.ExistsPlaces.Count()}");

    foreach (Validator validator in validators)
        validator.Verify(forValidations);

    Console.WriteLine("After Verify");
    foreach (var fv in forValidations)
        Console.WriteLine($"Object: {fv.CheckProperty} - count of places: {fv.ExistsPlaces.Count()}");
}

Результат

Before Verify
Object: v1 - count of places: 0
Object: v2 - count of places: 0
After Verify
Object: v1 - count of places: 2
Object: v2 - count of places: 2

Классы:

public class ForValidation
{
    private readonly object @lock = new object();

    private readonly List<int> ExistenceChecks = new List<int>();

    public IEnumerable<int> ExistsPlaces => ExistenceChecks;

    public string CheckProperty { get; }

    public ForValidation(string checkProperty)
    {
        CheckProperty = checkProperty;
    }

    public void ConfirmExistence(int place)
    {
        lock (@lock)
        {
            ExistenceChecks.Add(place);
        }
    }
}

public class Validator
{
    public Validator(int validatorNumber)
    {
        ValidatorNumber = validatorNumber;
    }

    public int ValidatorNumber { get; }


    public void Verify(IEnumerable<ForValidation> forValidations)
    {
        ForValidation[] copy = forValidations.ToArray();

        IEnumerable<string> checkProperties = from member in copy
                                              select member.CheckProperty;

        foreach (ForValidation forValidation in copy)
        {
            //if (existingMembers.FirstOrDefault(m => m.CheckProperty == forValidation.CheckProperty) != null)
            {
                forValidation.ConfirmExistence(ValidatorNumber);
            }
        }

        int x = copy.Length;
        //each forValidation.ExistsPlaces has items until this code block
    }
}
...